{
  "schemaVersion": "1.0",
  "item": {
    "slug": "soho-pay",
    "name": "Soho",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/max-clinch/soho-pay",
    "canonicalUrl": "https://clawhub.ai/max-clinch/soho-pay",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/soho-pay",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=soho-pay",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "package.json",
      "skill.json",
      "SKILL.md",
      "_meta.json",
      "src/pay.js",
      "src/signer/config.js"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/soho-pay"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/soho-pay",
    "agentPageUrl": "https://openagent3.xyz/skills/soho-pay/agent",
    "manifestUrl": "https://openagent3.xyz/skills/soho-pay/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/soho-pay/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "SOHO Pay — Credit Layer Payments",
        "body": "This skill orchestrates payments through the SOHO Pay Creditor smart contract using the spendWithAuthorization EIP-712 flow.\n\nThis skill is manual-invocation only. It must not be triggered autonomously by a model. Every invocation requires explicit user confirmation."
      },
      {
        "title": "Architecture — Three-Party Separation",
        "body": "┌──────────────────┐     ┌──────────────────┐     ┌──────────────────┐\n│  Wallet Signer   │     │   SoHo (Credit)  │     │   Blockchain     │\n│  (user/operator) │     │                  │     │   (Base)         │\n│                  │     │  Credit checks   │     │                  │\n│  Signs EIP-712   │────▶│  JIT funding     │────▶│  Settlement      │\n│  Owns keys       │     │  Authorization   │     │  Creditor.sol    │\n│                  │     │                  │     │                  │\n│  MPC / HSM /     │     │  NEVER signs     │     │                  │\n│  Turnkey / Privy │     │  NEVER holds keys│     │                  │\n└──────────────────┘     └──────────────────┘     └──────────────────┘\n\nSoHo is a credit layer only. It does not custody, hold, generate, or control any signing keys or key shards, and it does not produce EIP-712 signatures.\n\nAll EIP-712 signatures come from a separate Wallet Signer owned and controlled by the user or agent operator (e.g., MPC provider like Turnkey/Privy/Fireblocks, or a user wallet).\n\nThe skill orchestrates between:\n\nWallet Signer — signing (user/operator-controlled)\nSoHo — credit checks + just-in-time funding (credit layer only)\nBlockchain — settlement"
      },
      {
        "title": "Usage",
        "body": "node scripts/pay.js <amount> <merchantAddress> [payerAddress]\n\nArgumentDescriptionamountDecimal USDC value (e.g. 10, 0.5)merchantAddressExplicit 0x-prefixed EVM address (checksummed). Never a name.payerAddressRequired when SIGNER_PROVIDER=WALLET_SIGNER_REMOTE"
      },
      {
        "title": "Example — Base Sepolia with local key (dev only)",
        "body": "export RPC_URL=https://sepolia.base.org\nexport CHAIN_ID=84532\nexport SIGNER_PROVIDER=LOCAL_PRIVATE_KEY\nexport SOHO_DEV_PRIVATE_KEY=0xabc...\n\nnode scripts/pay.js 10 0x1234567890abcdef1234567890abcdef12345678"
      },
      {
        "title": "Example — Base Sepolia with remote wallet signer (production pattern)",
        "body": "export RPC_URL=https://sepolia.base.org\nexport CHAIN_ID=84532\nexport SIGNER_PROVIDER=WALLET_SIGNER_REMOTE\nexport WALLET_SIGNER_SERVICE_URL=https://your-mpc-signer.example.com\nexport SIGNER_SERVICE_AUTH_TOKEN=sk_live_...\n\nnode scripts/pay.js 10 0xMERCHANT... 0xPAYER..."
      },
      {
        "title": "Workflow",
        "body": "Validate config — all env vars checked with Zod at startup; unknown chains rejected.\nParse inputs — amount and explicit merchant address (no name-to-address generation).\nPre-flight credit checks — SoHo credit layer verifies borrower registration, active status, credit limit.\nSign EIP-712 — Wallet Signer (user-controlled) produces signature. SoHo never signs.\nSubmit tx — call spendWithAuthorization on the Creditor contract.\nReturn result — transaction hash + block number."
      },
      {
        "title": "Supported Networks",
        "body": "NetworkChain IDStatusBase Sepolia84532SupportedBase Mainnet8453Requires SOHO_MAINNET_CONFIRM=YES\n\nUnknown chain IDs are rejected at config validation time."
      },
      {
        "title": "Contract Addresses (Base Sepolia)",
        "body": "ContractAddressCreditor0x1867a19816f38ec31ec3af1be15fd7104f161978Borrower Manager0x76e51158015e869ab2875fa17b87383d8886e93cUSDC (test)0x55b8ff660d4f0f176de84f325d39a773a7a3bda7"
      },
      {
        "title": "Key Custody Boundary",
        "body": "EntityRoleHolds keys?Wallet SignerProduces EIP-712 signaturesYes — user/operator-controlledSoHoCredit authorization + JIT fundingNo — credit layer onlyThis skillOrchestration between the aboveNo — passes typed data to signer\n\nSoHo must NEVER custody, hold, generate, or control any signing keys or key shards."
      },
      {
        "title": "Wallet Signer Providers",
        "body": "ProviderWhen to useRisk levelWALLET_SIGNER_REMOTEProduction / MainnetLow — keys stay in user's MPC/HSM (Turnkey, Privy, Fireblocks, etc.)LOCAL_PRIVATE_KEYDev / Testnet onlyHigh — raw key in env\n\nDefault and recommended: WALLET_SIGNER_REMOTE. The skill sends EIP-712 typed data to the user's wallet signing service and never touches private keys.\nDev-only fallback: LOCAL_PRIVATE_KEY is gated to testnet chain IDs. Using it on mainnet requires DEV_ALLOW_LOCAL_KEY=YES and is strongly discouraged."
      },
      {
        "title": "Mainnet Safety Gate",
        "body": "Transactions on Base Mainnet (CHAIN_ID=8453) are refused unless SOHO_MAINNET_CONFIRM=YES is set. This prevents accidental mainnet spends during development."
      },
      {
        "title": "Recipient Address Policy",
        "body": "The skill never derives or generates an address from a merchant name. The merchantAddress argument must be an explicit, valid, checksummed EVM address. Any non-address input is rejected with an error."
      },
      {
        "title": "Invocation Policy",
        "body": "invocation: manual — the skill cannot be triggered autonomously.\nrequire_confirmation: true — the orchestrator must obtain user confirmation before execution.\nA runtime guard rejects execution if SOHO_AUTONOMOUS=true is detected in the environment."
      },
      {
        "title": "Threat Model & Mitigations",
        "body": "ThreatMitigationSigner compromiseDefault to WALLET_SIGNER_REMOTE (MPC/HSM); keys never leave the user's signing service. Local key gated to testnet only.Replay attacksRandom 32-byte nonce per transaction; validAfter / expiry window (10 min). On-chain nonce check in Creditor contract.Wrong merchant addressAddress generation from names removed. Only explicit checksummed EVM addresses accepted; checksum validated before signing.Accidental mainnet transactionSOHO_MAINNET_CONFIRM=YES safety gate required for chain ID 8453.Autonomous invocation with signing authorityinvocation: manual in metadata; require_confirmation: true; runtime guard blocks SOHO_AUTONOMOUS=true.SoHo used as signerArchitecture enforces SoHo = credit-only. No signing key env vars reference SoHo as a signer. Skill never passes keys to SoHo API.Undeclared env var dependenciesAll env vars declared in skill.json with types and sensitivity flags.MITM on wallet signer serviceUse HTTPS for WALLET_SIGNER_SERVICE_URL; bearer token auth via SIGNER_SERVICE_AUTH_TOKEN."
      },
      {
        "title": "Required (all modes)",
        "body": "VariableExampleDescriptionRPC_URLhttps://sepolia.base.orgJSON-RPC endpointCHAIN_ID8453284532 (Sepolia) or 8453 (Mainnet)SIGNER_PROVIDERWALLET_SIGNER_REMOTEWALLET_SIGNER_REMOTE or LOCAL_PRIVATE_KEY"
      },
      {
        "title": "Required for WALLET_SIGNER_REMOTE",
        "body": "VariableDescriptionSensitiveWALLET_SIGNER_SERVICE_URLBase URL of user/operator's wallet signing serviceNoSIGNER_SERVICE_AUTH_TOKENBearer auth token for the wallet signing serviceYes"
      },
      {
        "title": "SoHo Credit Layer",
        "body": "VariableDescriptionSensitiveSOHO_API_URLSoHo credit-layer API (credit checks, JIT funding)No"
      },
      {
        "title": "Required for LOCAL_PRIVATE_KEY (dev / testnet only)",
        "body": "VariableDescriptionSensitiveSOHO_DEV_PRIVATE_KEYUser/operator's raw hex private key (NOT a SoHo key)Yes"
      },
      {
        "title": "Conditional",
        "body": "VariableWhen requiredSOHO_MAINNET_CONFIRMMust be YES when CHAIN_ID=8453DEV_ALLOW_LOCAL_KEYSet YES to allow local key on non-testnet (dangerous)"
      },
      {
        "title": "Dependencies",
        "body": "Install with:\n\nnpm install\n\nPackagePurposeethersEVM interactions, EIP-712 signingdotenvLoad .env fileszodEnv var validation at startup"
      }
    ],
    "body": "SOHO Pay — Credit Layer Payments\n\nThis skill orchestrates payments through the SOHO Pay Creditor smart contract using the spendWithAuthorization EIP-712 flow.\n\nThis skill is manual-invocation only. It must not be triggered autonomously by a model. Every invocation requires explicit user confirmation.\n\nArchitecture — Three-Party Separation\n┌──────────────────┐     ┌──────────────────┐     ┌──────────────────┐\n│  Wallet Signer   │     │   SoHo (Credit)  │     │   Blockchain     │\n│  (user/operator) │     │                  │     │   (Base)         │\n│                  │     │  Credit checks   │     │                  │\n│  Signs EIP-712   │────▶│  JIT funding     │────▶│  Settlement      │\n│  Owns keys       │     │  Authorization   │     │  Creditor.sol    │\n│                  │     │                  │     │                  │\n│  MPC / HSM /     │     │  NEVER signs     │     │                  │\n│  Turnkey / Privy │     │  NEVER holds keys│     │                  │\n└──────────────────┘     └──────────────────┘     └──────────────────┘\n\n\nSoHo is a credit layer only. It does not custody, hold, generate, or control any signing keys or key shards, and it does not produce EIP-712 signatures.\n\nAll EIP-712 signatures come from a separate Wallet Signer owned and controlled by the user or agent operator (e.g., MPC provider like Turnkey/Privy/Fireblocks, or a user wallet).\n\nThe skill orchestrates between:\n\nWallet Signer — signing (user/operator-controlled)\nSoHo — credit checks + just-in-time funding (credit layer only)\nBlockchain — settlement\nUsage\nnode scripts/pay.js <amount> <merchantAddress> [payerAddress]\n\nArgument\tDescription\namount\tDecimal USDC value (e.g. 10, 0.5)\nmerchantAddress\tExplicit 0x-prefixed EVM address (checksummed). Never a name.\npayerAddress\tRequired when SIGNER_PROVIDER=WALLET_SIGNER_REMOTE\nExample — Base Sepolia with local key (dev only)\nexport RPC_URL=https://sepolia.base.org\nexport CHAIN_ID=84532\nexport SIGNER_PROVIDER=LOCAL_PRIVATE_KEY\nexport SOHO_DEV_PRIVATE_KEY=0xabc...\n\nnode scripts/pay.js 10 0x1234567890abcdef1234567890abcdef12345678\n\nExample — Base Sepolia with remote wallet signer (production pattern)\nexport RPC_URL=https://sepolia.base.org\nexport CHAIN_ID=84532\nexport SIGNER_PROVIDER=WALLET_SIGNER_REMOTE\nexport WALLET_SIGNER_SERVICE_URL=https://your-mpc-signer.example.com\nexport SIGNER_SERVICE_AUTH_TOKEN=sk_live_...\n\nnode scripts/pay.js 10 0xMERCHANT... 0xPAYER...\n\nWorkflow\nValidate config — all env vars checked with Zod at startup; unknown chains rejected.\nParse inputs — amount and explicit merchant address (no name-to-address generation).\nPre-flight credit checks — SoHo credit layer verifies borrower registration, active status, credit limit.\nSign EIP-712 — Wallet Signer (user-controlled) produces signature. SoHo never signs.\nSubmit tx — call spendWithAuthorization on the Creditor contract.\nReturn result — transaction hash + block number.\nSupported Networks\nNetwork\tChain ID\tStatus\nBase Sepolia\t84532\tSupported\nBase Mainnet\t8453\tRequires SOHO_MAINNET_CONFIRM=YES\n\nUnknown chain IDs are rejected at config validation time.\n\nContract Addresses (Base Sepolia)\nContract\tAddress\nCreditor\t0x1867a19816f38ec31ec3af1be15fd7104f161978\nBorrower Manager\t0x76e51158015e869ab2875fa17b87383d8886e93c\nUSDC (test)\t0x55b8ff660d4f0f176de84f325d39a773a7a3bda7\nSecurity Model\nKey Custody Boundary\nEntity\tRole\tHolds keys?\nWallet Signer\tProduces EIP-712 signatures\tYes — user/operator-controlled\nSoHo\tCredit authorization + JIT funding\tNo — credit layer only\nThis skill\tOrchestration between the above\tNo — passes typed data to signer\n\nSoHo must NEVER custody, hold, generate, or control any signing keys or key shards.\n\nWallet Signer Providers\nProvider\tWhen to use\tRisk level\nWALLET_SIGNER_REMOTE\tProduction / Mainnet\tLow — keys stay in user's MPC/HSM (Turnkey, Privy, Fireblocks, etc.)\nLOCAL_PRIVATE_KEY\tDev / Testnet only\tHigh — raw key in env\nDefault and recommended: WALLET_SIGNER_REMOTE. The skill sends EIP-712 typed data to the user's wallet signing service and never touches private keys.\nDev-only fallback: LOCAL_PRIVATE_KEY is gated to testnet chain IDs. Using it on mainnet requires DEV_ALLOW_LOCAL_KEY=YES and is strongly discouraged.\nMainnet Safety Gate\n\nTransactions on Base Mainnet (CHAIN_ID=8453) are refused unless SOHO_MAINNET_CONFIRM=YES is set. This prevents accidental mainnet spends during development.\n\nRecipient Address Policy\n\nThe skill never derives or generates an address from a merchant name. The merchantAddress argument must be an explicit, valid, checksummed EVM address. Any non-address input is rejected with an error.\n\nInvocation Policy\ninvocation: manual — the skill cannot be triggered autonomously.\nrequire_confirmation: true — the orchestrator must obtain user confirmation before execution.\nA runtime guard rejects execution if SOHO_AUTONOMOUS=true is detected in the environment.\nThreat Model & Mitigations\nThreat\tMitigation\nSigner compromise\tDefault to WALLET_SIGNER_REMOTE (MPC/HSM); keys never leave the user's signing service. Local key gated to testnet only.\nReplay attacks\tRandom 32-byte nonce per transaction; validAfter / expiry window (10 min). On-chain nonce check in Creditor contract.\nWrong merchant address\tAddress generation from names removed. Only explicit checksummed EVM addresses accepted; checksum validated before signing.\nAccidental mainnet transaction\tSOHO_MAINNET_CONFIRM=YES safety gate required for chain ID 8453.\nAutonomous invocation with signing authority\tinvocation: manual in metadata; require_confirmation: true; runtime guard blocks SOHO_AUTONOMOUS=true.\nSoHo used as signer\tArchitecture enforces SoHo = credit-only. No signing key env vars reference SoHo as a signer. Skill never passes keys to SoHo API.\nUndeclared env var dependencies\tAll env vars declared in skill.json with types and sensitivity flags.\nMITM on wallet signer service\tUse HTTPS for WALLET_SIGNER_SERVICE_URL; bearer token auth via SIGNER_SERVICE_AUTH_TOKEN.\nEnvironment Variables\nRequired (all modes)\nVariable\tExample\tDescription\nRPC_URL\thttps://sepolia.base.org\tJSON-RPC endpoint\nCHAIN_ID\t84532\t84532 (Sepolia) or 8453 (Mainnet)\nSIGNER_PROVIDER\tWALLET_SIGNER_REMOTE\tWALLET_SIGNER_REMOTE or LOCAL_PRIVATE_KEY\nRequired for WALLET_SIGNER_REMOTE\nVariable\tDescription\tSensitive\nWALLET_SIGNER_SERVICE_URL\tBase URL of user/operator's wallet signing service\tNo\nSIGNER_SERVICE_AUTH_TOKEN\tBearer auth token for the wallet signing service\tYes\nSoHo Credit Layer\nVariable\tDescription\tSensitive\nSOHO_API_URL\tSoHo credit-layer API (credit checks, JIT funding)\tNo\nRequired for LOCAL_PRIVATE_KEY (dev / testnet only)\nVariable\tDescription\tSensitive\nSOHO_DEV_PRIVATE_KEY\tUser/operator's raw hex private key (NOT a SoHo key)\tYes\nConditional\nVariable\tWhen required\nSOHO_MAINNET_CONFIRM\tMust be YES when CHAIN_ID=8453\nDEV_ALLOW_LOCAL_KEY\tSet YES to allow local key on non-testnet (dangerous)\nDependencies\n\nInstall with:\n\nnpm install\n\nPackage\tPurpose\nethers\tEVM interactions, EIP-712 signing\ndotenv\tLoad .env files\nzod\tEnv var validation at startup"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/max-clinch/soho-pay",
    "publisherUrl": "https://clawhub.ai/max-clinch/soho-pay",
    "owner": "max-clinch",
    "version": "2.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/soho-pay",
    "downloadUrl": "https://openagent3.xyz/downloads/soho-pay",
    "agentUrl": "https://openagent3.xyz/skills/soho-pay/agent",
    "manifestUrl": "https://openagent3.xyz/skills/soho-pay/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/soho-pay/agent.md"
  }
}