{
  "schemaVersion": "1.0",
  "item": {
    "slug": "cifer-sdk",
    "name": "Cifer SDK",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/mohsinriaz17/cifer-sdk",
    "canonicalUrl": "https://clawhub.ai/mohsinriaz17/cifer-sdk",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/cifer-sdk",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=cifer-sdk",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "skill.md"
    ],
    "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-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.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/cifer-sdk"
    },
    "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/cifer-sdk",
    "agentPageUrl": "https://openagent3.xyz/skills/cifer-sdk/agent",
    "manifestUrl": "https://openagent3.xyz/skills/cifer-sdk/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/cifer-sdk/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": "CIFER SDK - Quantum-Resistant Blockchain Encryption",
        "body": "Skill for AI Agents | Enable quantum-resistant encryption in blockchain applications using the CIFER SDK."
      },
      {
        "title": "Overview",
        "body": "CIFER (Cryptographic Infrastructure for Encrypted Records) SDK provides quantum-resistant encryption for blockchain applications. This skill enables AI agents to implement secure data encryption, secret management, and on-chain commitments using post-quantum cryptography."
      },
      {
        "title": "Key Capabilities",
        "body": "Quantum-Resistant Encryption: ML-KEM-768 (NIST standardized) key encapsulation\nMulti-Chain Support: Automatic chain discovery and configuration\nWallet Agnostic: Works with MetaMask, WalletConnect, Coinbase, Thirdweb, and custom signers\nFile Encryption: Async job system for large file encryption/decryption\nOn-Chain Commitments: Store encrypted data references on-chain with log-based retrieval\nTransaction Intents: Non-custodial pattern - you control transaction execution"
      },
      {
        "title": "When to Use This Skill",
        "body": "Use the CIFER SDK when you need to:\n\nEncrypt sensitive data with quantum-resistant algorithms\nStore encrypted records on blockchain\nManage encryption keys with owner/delegate authorization\nEncrypt files larger than 16KB using the job system\nBuild applications requiring post-quantum security"
      },
      {
        "title": "Installation",
        "body": "npm install cifer-sdk\n# or\nyarn add cifer-sdk\n# or\npnpm add cifer-sdk\n\nRequirements: Node.js 18.0+, TypeScript 5.0+ (recommended)"
      },
      {
        "title": "Quick Start",
        "body": "import { createCiferSdk, Eip1193SignerAdapter, blackbox } from 'cifer-sdk';\n\n// 1. Initialize SDK with auto-discovery\nconst sdk = await createCiferSdk({\n  blackboxUrl: 'https://blackbox.cifer.network',\n});\n\n// 2. Connect wallet (browser)\nconst signer = new Eip1193SignerAdapter(window.ethereum);\n\n// 3. Encrypt data\nconst encrypted = await blackbox.payload.encryptPayload({\n  chainId: 752025,\n  secretId: 123n,\n  plaintext: 'My secret message',\n  signer,\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n});\n\n// 4. Decrypt data\nconst decrypted = await blackbox.payload.decryptPayload({\n  chainId: 752025,\n  secretId: 123n,\n  encryptedMessage: encrypted.encryptedMessage,\n  cifer: encrypted.cifer,\n  signer,\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n});\n\nconsole.log(decrypted.decryptedMessage); // 'My secret message'"
      },
      {
        "title": "Secrets",
        "body": "A secret is the core primitive in CIFER. Each secret represents an ML-KEM-768 key pair:\n\nPropertyDescriptionownerAddress that can transfer, set delegate, and decryptdelegateAddress that can decrypt only (zero address if none)isSyncingtrue while key generation is in progressclusterIdWhich enclave cluster holds the private key shardssecretType1 = ML-KEM-768 (standard)publicKeyCidIPFS CID of public key (empty if syncing)\n\nLifecycle: Creation → Syncing (~30-60s) → Ready"
      },
      {
        "title": "Authorization Model",
        "body": "RoleCapabilitiesOwnerEncrypt, decrypt, transfer, set delegateDelegateDecrypt only"
      },
      {
        "title": "Encryption Model",
        "body": "CIFER uses hybrid encryption:\n\nML-KEM-768: Post-quantum key encapsulation (1088-byte ciphertext)\nAES-256-GCM: Symmetric encryption for actual data\n\nOutput format:\n\ncifer: 1104 bytes (ML-KEM ciphertext + tag)\nencryptedMessage: Variable length (max 16KB)"
      },
      {
        "title": "Transaction Intents",
        "body": "The SDK returns transaction intents instead of executing transactions:\n\ninterface TxIntent {\n  chainId: number;\n  to: Address;\n  data: Hex;\n  value?: bigint;\n}\n\nExecute with any wallet library (ethers, wagmi, viem)."
      },
      {
        "title": "SDK Initialization",
        "body": "With Discovery (Recommended)\n\nconst sdk = await createCiferSdk({\n  blackboxUrl: 'https://blackbox.cifer.network',\n});\n\nsdk.getSupportedChainIds(); // [752025, 11155111, ...]\nsdk.getControllerAddress(752025); // '0x...'\nsdk.getRpcUrl(752025); // 'https://...'\n\nWith Overrides\n\nconst sdk = await createCiferSdk({\n  blackboxUrl: 'https://blackbox.cifer.network',\n  chainOverrides: {\n    752025: {\n      rpcUrl: 'https://my-private-rpc.example.com',\n      secretsControllerAddress: '0x...',\n    },\n  },\n});\n\nSynchronous (No Discovery)\n\nimport { createCiferSdkSync, RpcReadClient } from 'cifer-sdk';\n\nconst readClient = new RpcReadClient({\n  rpcUrlByChainId: {\n    752025: 'https://mainnet.ternoa.network',\n  },\n});\n\nconst sdk = createCiferSdkSync({\n  blackboxUrl: 'https://blackbox.cifer.network',\n  readClient,\n  chainOverrides: {\n    752025: {\n      rpcUrl: 'https://mainnet.ternoa.network',\n      secretsControllerAddress: '0x...',\n    },\n  },\n});"
      },
      {
        "title": "Wallet Integration",
        "body": "All wallets must implement the SignerAdapter interface:\n\ninterface SignerAdapter {\n  getAddress(): Promise<string>;\n  signMessage(message: string): Promise<string>;\n  sendTransaction?(txRequest: TxIntent): Promise<TxExecutionResult>;\n}\n\nMetaMask\n\nimport { Eip1193SignerAdapter } from 'cifer-sdk';\n\nawait window.ethereum.request({ method: 'eth_requestAccounts' });\nconst signer = new Eip1193SignerAdapter(window.ethereum);\n\nWalletConnect v2\n\nimport { EthereumProvider } from '@walletconnect/ethereum-provider';\n\nconst provider = await EthereumProvider.init({\n  projectId: 'YOUR_WALLETCONNECT_PROJECT_ID',\n  chains: [752025],\n  showQrModal: true,\n});\n\nawait provider.connect();\nconst signer = new Eip1193SignerAdapter(provider);\n\nPrivate Key (Server-Side)\n\nimport { Wallet } from 'ethers';\n\nconst wallet = new Wallet(process.env.PRIVATE_KEY);\n\nconst signer = {\n  async getAddress() { return wallet.address; },\n  async signMessage(message) { return wallet.signMessage(message); },\n};\n\nwagmi (React)\n\nimport { useAccount, useConnectorClient } from 'wagmi';\n\nfunction useCiferSigner() {\n  const { address, isConnected } = useAccount();\n  const { data: connectorClient } = useConnectorClient();\n\n  const getSigner = async () => {\n    if (!isConnected || !connectorClient) {\n      throw new Error('Wallet not connected');\n    }\n    const provider = await connectorClient.transport;\n    return new Eip1193SignerAdapter(provider);\n  };\n\n  return { getSigner, address, isConnected };\n}"
      },
      {
        "title": "keyManagement Namespace",
        "body": "Interact with the SecretsController contract for secret management.\n\nRead Operations\n\n// Get secret creation fee\nconst fee = await keyManagement.getSecretCreationFee({\n  chainId: 752025,\n  controllerAddress: sdk.getControllerAddress(752025),\n  readClient: sdk.readClient,\n});\n\n// Get secret state\nconst state = await keyManagement.getSecret(params, 123n);\n// Returns: { owner, delegate, isSyncing, clusterId, secretType, publicKeyCid }\n\n// Check if secret is ready\nconst ready = await keyManagement.isSecretReady(params, 123n);\n\n// Check authorization\nconst canDecrypt = await keyManagement.isAuthorized(params, 123n, '0x...');\n\n// Get secrets by wallet\nconst secrets = await keyManagement.getSecretsByWallet(params, '0xUser...');\n// Returns: { owned: bigint[], delegated: bigint[] }\n\nTransaction Builders\n\n// Create a new secret\nconst fee = await keyManagement.getSecretCreationFee(params);\nconst txIntent = keyManagement.buildCreateSecretTx({\n  chainId: 752025,\n  controllerAddress: sdk.getControllerAddress(752025),\n  fee,\n});\n\n// Set delegate\nconst txIntent = keyManagement.buildSetDelegateTx({\n  chainId: 752025,\n  controllerAddress: sdk.getControllerAddress(752025),\n  secretId: 123n,\n  newDelegate: '0xDelegate...',\n});\n\n// Remove delegate\nconst txIntent = keyManagement.buildRemoveDelegationTx({ ... });\n\n// Transfer ownership (irreversible!)\nconst txIntent = keyManagement.buildTransferSecretTx({\n  chainId: 752025,\n  controllerAddress: sdk.getControllerAddress(752025),\n  secretId: 123n,\n  newOwner: '0xNewOwner...',\n});\n\nEvent Parsing\n\nconst receipt = await provider.waitForTransaction(hash);\nconst secretId = keyManagement.extractSecretIdFromReceipt(receipt.logs);"
      },
      {
        "title": "blackbox.payload Namespace",
        "body": "Encrypt and decrypt short messages (< 16KB).\n\nEncrypt\n\nconst encrypted = await blackbox.payload.encryptPayload({\n  chainId: 752025,\n  secretId: 123n,\n  plaintext: 'My secret message',\n  signer,\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n  outputFormat: 'hex', // or 'base64'\n});\n\n// Returns: { cifer: string, encryptedMessage: string }\n\nDecrypt\n\nconst decrypted = await blackbox.payload.decryptPayload({\n  chainId: 752025,\n  secretId: 123n,\n  encryptedMessage: encrypted.encryptedMessage,\n  cifer: encrypted.cifer,\n  signer, // Must be owner or delegate\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n  inputFormat: 'hex',\n});\n\n// Returns: { decryptedMessage: string }"
      },
      {
        "title": "blackbox.files Namespace",
        "body": "Encrypt and decrypt large files using async jobs.\n\n// Start encryption job\nconst job = await blackbox.files.encryptFile({\n  chainId: 752025,\n  secretId: 123n,\n  file: myFile,\n  signer,\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n});\n// Returns: { jobId: string, message: string }\n\n// Start decryption job\nconst job = await blackbox.files.decryptFile({ ... });\n\n// Decrypt from existing encrypt job\nconst job = await blackbox.files.decryptExistingFile({\n  chainId: 752025,\n  secretId: 123n,\n  encryptJobId: previousJobId,\n  signer,\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n});"
      },
      {
        "title": "blackbox.jobs Namespace",
        "body": "Manage async file jobs.\n\n// Get job status\nconst status = await blackbox.jobs.getStatus(jobId, sdk.blackboxUrl);\n// Returns: { id, type, status, progress, secretId, chainId, ... }\n\n// Poll until complete\nconst finalStatus = await blackbox.jobs.pollUntilComplete(\n  jobId,\n  sdk.blackboxUrl,\n  {\n    intervalMs: 2000,\n    maxAttempts: 120,\n    onProgress: (job) => console.log(`Progress: ${job.progress}%`),\n  }\n);\n\n// Download result (encrypt jobs: no auth, decrypt jobs: auth required)\nconst blob = await blackbox.jobs.download(jobId, {\n  blackboxUrl: sdk.blackboxUrl,\n  // For decrypt jobs, also provide:\n  chainId: 752025,\n  secretId: 123n,\n  signer,\n  readClient: sdk.readClient,\n});\n\n// List jobs for wallet\nconst result = await blackbox.jobs.list({\n  chainId: 752025,\n  signer,\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n});\n\n// Get data consumption stats\nconst stats = await blackbox.jobs.dataConsumption({ ... });"
      },
      {
        "title": "commitments Namespace",
        "body": "Store and retrieve encrypted data on-chain.\n\n// Check if commitment exists\nconst exists = await commitments.ciferDataExists(params, dataId);\n\n// Get metadata\nconst metadata = await commitments.getCIFERMetadata(params, dataId);\n// Returns: { secretId, storedAtBlock, ciferHash, encryptedMessageHash }\n\n// Fetch encrypted data from logs\nconst data = await commitments.fetchCommitmentFromLogs({\n  chainId: 752025,\n  contractAddress: '0x...',\n  dataId: dataKey,\n  storedAtBlock: metadata.storedAtBlock,\n  readClient: sdk.readClient,\n});\n// Returns: { cifer, encryptedMessage, ciferHash, encryptedMessageHash }\n\n// Verify integrity\nconst result = commitments.verifyCommitmentIntegrity(data, metadata);\n\n// Build store transaction\nconst txIntent = commitments.buildStoreCommitmentTx({\n  chainId: 752025,\n  contractAddress: '0xYourContract...',\n  storeFunction: {\n    type: 'function',\n    name: 'store',\n    inputs: [\n      { name: 'key', type: 'bytes32' },\n      { name: 'encryptedMessage', type: 'bytes' },\n      { name: 'cifer', type: 'bytes' },\n    ],\n  },\n  args: {\n    key: dataKey,\n    secretId: 123n,\n    encryptedMessage: encrypted.encryptedMessage,\n    cifer: encrypted.cifer,\n  },\n});\n\nConstants:\n\nCIFER_ENVELOPE_BYTES = 1104 (fixed cifer size)\nMAX_PAYLOAD_BYTES = 16384 (16KB max payload)"
      },
      {
        "title": "flows Namespace",
        "body": "High-level orchestrated operations.\n\nFlow Context\n\nconst ctx = {\n  signer: SignerAdapter,\n  readClient: ReadClient,\n  blackboxUrl: string,\n  chainId: number,\n  controllerAddress?: Address,\n  txExecutor?: (intent: TxIntent) => Promise<TxExecutionResult>,\n  pollingStrategy?: { intervalMs: number, maxAttempts: number },\n  logger?: (message: string) => void,\n  abortSignal?: AbortSignal,\n};\n\nCreate Secret and Wait\n\nconst result = await flows.createSecretAndWaitReady({\n  ...ctx,\n  controllerAddress: sdk.getControllerAddress(752025),\n  txExecutor: async (intent) => {\n    const hash = await wallet.sendTransaction(intent);\n    return { hash, waitReceipt: () => provider.waitForTransaction(hash) };\n  },\n});\n\nif (result.success) {\n  console.log('Secret ID:', result.data.secretId);\n  console.log('Public Key CID:', result.data.state.publicKeyCid);\n}\n\nEncrypt and Prepare Commit\n\nconst result = await flows.encryptThenPrepareCommitTx(ctx, {\n  secretId: 123n,\n  plaintext: 'My secret data',\n  key: dataKey,\n  commitmentContract: '0x...',\n});\n\nif (result.success) {\n  await wallet.sendTransaction(result.data.txIntent);\n}\n\nRetrieve and Decrypt from Logs\n\nconst result = await flows.retrieveFromLogsThenDecrypt(ctx, {\n  secretId: 123n,\n  dataId: dataKey,\n  commitmentContract: '0x...',\n});\n\nif (result.success) {\n  console.log('Decrypted:', result.data.decryptedMessage);\n}\n\nFile Flows\n\n// Encrypt file flow\nconst result = await flows.encryptFileJobFlow(ctx, {\n  secretId: 123n,\n  file: myFile,\n});\n// Returns: { jobId, job, encryptedFile: Blob }\n\n// Decrypt file flow\nconst result = await flows.decryptFileJobFlow(ctx, {\n  secretId: 123n,\n  file: ciferFile,\n});\n// Returns: { jobId, job, decryptedFile: Blob }"
      },
      {
        "title": "Error Handling",
        "body": "All SDK errors extend CiferError with typed subclasses:\n\nCiferError\n├── ConfigError\n│   ├── DiscoveryError\n│   └── ChainNotSupportedError\n├── AuthError\n│   ├── SignatureError\n│   ├── BlockStaleError\n│   └── SignerMismatchError\n├── BlackboxError\n│   ├── EncryptionError\n│   ├── DecryptionError\n│   ├── JobError\n│   └── SecretNotReadyError\n├── KeyManagementError\n│   ├── SecretNotFoundError\n│   └── NotAuthorizedError\n├── CommitmentsError\n│   ├── CommitmentNotFoundError\n│   ├── IntegrityError\n│   ├── InvalidCiferSizeError\n│   └── PayloadTooLargeError\n└── FlowError\n    ├── FlowAbortedError\n    └── FlowTimeoutError"
      },
      {
        "title": "Type Guards",
        "body": "import {\n  isCiferError,\n  isBlockStaleError,\n  isSecretNotReadyError,\n} from 'cifer-sdk';"
      },
      {
        "title": "Error Handling Example",
        "body": "try {\n  await blackbox.payload.encryptPayload({ ... });\n} catch (error) {\n  if (isBlockStaleError(error)) {\n    console.log('RPC returning stale blocks');\n  } else if (error instanceof SecretNotReadyError) {\n    console.log('Wait for secret to sync');\n  } else if (error instanceof SecretNotFoundError) {\n    console.log('Secret not found:', error.secretId);\n  } else if (isCiferError(error)) {\n    console.log('CIFER error:', error.code, error.message);\n  } else {\n    throw error;\n  }\n}"
      },
      {
        "title": "Common Scenarios",
        "body": "ErrorCauseSolution\"Block number is too old\"RPC issuesSDK auto-retries 3x; check RPC reliability\"Secret is syncing\"Key generation in progressWait 30-60s; use isSecretReady()\"Signature verification failed\"Wrong signing methodUse EIP-191 personal_sign\"Not authorized\"Not owner/delegateCheck with isAuthorized()"
      },
      {
        "title": "Browser: Encrypt/Decrypt Message",
        "body": "import { createCiferSdk, Eip1193SignerAdapter, blackbox } from 'cifer-sdk';\n\nasync function encryptDecryptExample() {\n  const sdk = await createCiferSdk({\n    blackboxUrl: 'https://blackbox.cifer.network',\n  });\n  const signer = new Eip1193SignerAdapter(window.ethereum);\n  \n  const chainId = 752025;\n  const secretId = 123n;\n  \n  // Encrypt\n  const encrypted = await blackbox.payload.encryptPayload({\n    chainId,\n    secretId,\n    plaintext: 'Hello, CIFER!',\n    signer,\n    readClient: sdk.readClient,\n    blackboxUrl: sdk.blackboxUrl,\n  });\n  \n  // Decrypt\n  const decrypted = await blackbox.payload.decryptPayload({\n    chainId,\n    secretId,\n    encryptedMessage: encrypted.encryptedMessage,\n    cifer: encrypted.cifer,\n    signer,\n    readClient: sdk.readClient,\n    blackboxUrl: sdk.blackboxUrl,\n  });\n  \n  console.log('Decrypted:', decrypted.decryptedMessage);\n}"
      },
      {
        "title": "Node.js Server-Side",
        "body": "import { createCiferSdk, RpcReadClient, blackbox } from 'cifer-sdk';\nimport { Wallet } from 'ethers';\n\nasync function serverSideExample() {\n  const readClient = new RpcReadClient({\n    rpcUrlByChainId: {\n      752025: 'https://mainnet.ternoa.network',\n    },\n  });\n  \n  const sdk = await createCiferSdk({\n    blackboxUrl: 'https://blackbox.cifer.network',\n    readClient,\n  });\n  \n  const wallet = new Wallet(process.env.PRIVATE_KEY);\n  const signer = {\n    async getAddress() { return wallet.address; },\n    async signMessage(message) { return wallet.signMessage(message); },\n  };\n  \n  const encrypted = await blackbox.payload.encryptPayload({\n    chainId: 752025,\n    secretId: 123n,\n    plaintext: 'Server-side encryption',\n    signer,\n    readClient: sdk.readClient,\n    blackboxUrl: sdk.blackboxUrl,\n  });\n  \n  console.log('Encrypted on server:', encrypted);\n}"
      },
      {
        "title": "File Encryption with Progress",
        "body": "import { createCiferSdk, Eip1193SignerAdapter, blackbox } from 'cifer-sdk';\n\nasync function fileEncryptionExample() {\n  const sdk = await createCiferSdk({\n    blackboxUrl: 'https://blackbox.cifer.network',\n  });\n  const signer = new Eip1193SignerAdapter(window.ethereum);\n  \n  const file = document.getElementById('fileInput').files[0];\n  \n  // Start job\n  const job = await blackbox.files.encryptFile({\n    chainId: 752025,\n    secretId: 123n,\n    file,\n    signer,\n    readClient: sdk.readClient,\n    blackboxUrl: sdk.blackboxUrl,\n  });\n  \n  // Poll with progress\n  const finalStatus = await blackbox.jobs.pollUntilComplete(\n    job.jobId,\n    sdk.blackboxUrl,\n    {\n      onProgress: (status) => console.log(`Progress: ${status.progress}%`),\n    }\n  );\n  \n  if (finalStatus.status === 'completed') {\n    const encryptedBlob = await blackbox.jobs.download(job.jobId, {\n      blackboxUrl: sdk.blackboxUrl,\n    });\n    \n    // Download file\n    const url = URL.createObjectURL(encryptedBlob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = 'encrypted.cifer';\n    a.click();\n  }\n}"
      },
      {
        "title": "Type Definitions",
        "body": "type Address = `0x${string}`;\ntype Bytes32 = `0x${string}`;\ntype Hex = `0x${string}`;\ntype ChainId = number;\ntype SecretId = bigint;\ntype OutputFormat = 'hex' | 'base64';\ntype JobStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'expired';\ntype JobType = 'encrypt' | 'decrypt';\n\ninterface SecretState {\n  owner: Address;\n  delegate: Address;\n  isSyncing: boolean;\n  clusterId: number;\n  secretType: number;\n  publicKeyCid: string;\n}\n\ninterface JobInfo {\n  id: string;\n  type: JobType;\n  status: JobStatus;\n  progress: number;\n  secretId: number;\n  chainId: ChainId;\n  createdAt: number;\n  completedAt?: number;\n  error?: string;\n  resultFileName?: string;\n  ttl: number;\n  originalSize?: number;\n}\n\ninterface FlowResult<T> {\n  success: boolean;\n  plan: FlowPlan;\n  data?: T;\n  error?: Error;\n  receipts?: TransactionReceipt[];\n}"
      },
      {
        "title": "Resources",
        "body": "npm: https://www.npmjs.com/package/cifer-sdk\nGitHub: https://github.com/cifer-security/cifer-sdk\nBlackbox API: https://blackbox.cifer.network\nSupported Chain: Ternoa (752025)\n\nThis skill enables AI agents to implement quantum-resistant encryption in blockchain applications using the CIFER SDK."
      }
    ],
    "body": "CIFER SDK - Quantum-Resistant Blockchain Encryption\n\nSkill for AI Agents | Enable quantum-resistant encryption in blockchain applications using the CIFER SDK.\n\nOverview\n\nCIFER (Cryptographic Infrastructure for Encrypted Records) SDK provides quantum-resistant encryption for blockchain applications. This skill enables AI agents to implement secure data encryption, secret management, and on-chain commitments using post-quantum cryptography.\n\nKey Capabilities\nQuantum-Resistant Encryption: ML-KEM-768 (NIST standardized) key encapsulation\nMulti-Chain Support: Automatic chain discovery and configuration\nWallet Agnostic: Works with MetaMask, WalletConnect, Coinbase, Thirdweb, and custom signers\nFile Encryption: Async job system for large file encryption/decryption\nOn-Chain Commitments: Store encrypted data references on-chain with log-based retrieval\nTransaction Intents: Non-custodial pattern - you control transaction execution\nWhen to Use This Skill\n\nUse the CIFER SDK when you need to:\n\nEncrypt sensitive data with quantum-resistant algorithms\nStore encrypted records on blockchain\nManage encryption keys with owner/delegate authorization\nEncrypt files larger than 16KB using the job system\nBuild applications requiring post-quantum security\nInstallation\nnpm install cifer-sdk\n# or\nyarn add cifer-sdk\n# or\npnpm add cifer-sdk\n\n\nRequirements: Node.js 18.0+, TypeScript 5.0+ (recommended)\n\nQuick Start\nimport { createCiferSdk, Eip1193SignerAdapter, blackbox } from 'cifer-sdk';\n\n// 1. Initialize SDK with auto-discovery\nconst sdk = await createCiferSdk({\n  blackboxUrl: 'https://blackbox.cifer.network',\n});\n\n// 2. Connect wallet (browser)\nconst signer = new Eip1193SignerAdapter(window.ethereum);\n\n// 3. Encrypt data\nconst encrypted = await blackbox.payload.encryptPayload({\n  chainId: 752025,\n  secretId: 123n,\n  plaintext: 'My secret message',\n  signer,\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n});\n\n// 4. Decrypt data\nconst decrypted = await blackbox.payload.decryptPayload({\n  chainId: 752025,\n  secretId: 123n,\n  encryptedMessage: encrypted.encryptedMessage,\n  cifer: encrypted.cifer,\n  signer,\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n});\n\nconsole.log(decrypted.decryptedMessage); // 'My secret message'\n\nCore Concepts\nSecrets\n\nA secret is the core primitive in CIFER. Each secret represents an ML-KEM-768 key pair:\n\nProperty\tDescription\nowner\tAddress that can transfer, set delegate, and decrypt\ndelegate\tAddress that can decrypt only (zero address if none)\nisSyncing\ttrue while key generation is in progress\nclusterId\tWhich enclave cluster holds the private key shards\nsecretType\t1 = ML-KEM-768 (standard)\npublicKeyCid\tIPFS CID of public key (empty if syncing)\n\nLifecycle: Creation → Syncing (~30-60s) → Ready\n\nAuthorization Model\nRole\tCapabilities\nOwner\tEncrypt, decrypt, transfer, set delegate\nDelegate\tDecrypt only\nEncryption Model\n\nCIFER uses hybrid encryption:\n\nML-KEM-768: Post-quantum key encapsulation (1088-byte ciphertext)\nAES-256-GCM: Symmetric encryption for actual data\n\nOutput format:\n\ncifer: 1104 bytes (ML-KEM ciphertext + tag)\nencryptedMessage: Variable length (max 16KB)\nTransaction Intents\n\nThe SDK returns transaction intents instead of executing transactions:\n\ninterface TxIntent {\n  chainId: number;\n  to: Address;\n  data: Hex;\n  value?: bigint;\n}\n\n\nExecute with any wallet library (ethers, wagmi, viem).\n\nAPI Reference\nSDK Initialization\nWith Discovery (Recommended)\nconst sdk = await createCiferSdk({\n  blackboxUrl: 'https://blackbox.cifer.network',\n});\n\nsdk.getSupportedChainIds(); // [752025, 11155111, ...]\nsdk.getControllerAddress(752025); // '0x...'\nsdk.getRpcUrl(752025); // 'https://...'\n\nWith Overrides\nconst sdk = await createCiferSdk({\n  blackboxUrl: 'https://blackbox.cifer.network',\n  chainOverrides: {\n    752025: {\n      rpcUrl: 'https://my-private-rpc.example.com',\n      secretsControllerAddress: '0x...',\n    },\n  },\n});\n\nSynchronous (No Discovery)\nimport { createCiferSdkSync, RpcReadClient } from 'cifer-sdk';\n\nconst readClient = new RpcReadClient({\n  rpcUrlByChainId: {\n    752025: 'https://mainnet.ternoa.network',\n  },\n});\n\nconst sdk = createCiferSdkSync({\n  blackboxUrl: 'https://blackbox.cifer.network',\n  readClient,\n  chainOverrides: {\n    752025: {\n      rpcUrl: 'https://mainnet.ternoa.network',\n      secretsControllerAddress: '0x...',\n    },\n  },\n});\n\nWallet Integration\n\nAll wallets must implement the SignerAdapter interface:\n\ninterface SignerAdapter {\n  getAddress(): Promise<string>;\n  signMessage(message: string): Promise<string>;\n  sendTransaction?(txRequest: TxIntent): Promise<TxExecutionResult>;\n}\n\nMetaMask\nimport { Eip1193SignerAdapter } from 'cifer-sdk';\n\nawait window.ethereum.request({ method: 'eth_requestAccounts' });\nconst signer = new Eip1193SignerAdapter(window.ethereum);\n\nWalletConnect v2\nimport { EthereumProvider } from '@walletconnect/ethereum-provider';\n\nconst provider = await EthereumProvider.init({\n  projectId: 'YOUR_WALLETCONNECT_PROJECT_ID',\n  chains: [752025],\n  showQrModal: true,\n});\n\nawait provider.connect();\nconst signer = new Eip1193SignerAdapter(provider);\n\nPrivate Key (Server-Side)\nimport { Wallet } from 'ethers';\n\nconst wallet = new Wallet(process.env.PRIVATE_KEY);\n\nconst signer = {\n  async getAddress() { return wallet.address; },\n  async signMessage(message) { return wallet.signMessage(message); },\n};\n\nwagmi (React)\nimport { useAccount, useConnectorClient } from 'wagmi';\n\nfunction useCiferSigner() {\n  const { address, isConnected } = useAccount();\n  const { data: connectorClient } = useConnectorClient();\n\n  const getSigner = async () => {\n    if (!isConnected || !connectorClient) {\n      throw new Error('Wallet not connected');\n    }\n    const provider = await connectorClient.transport;\n    return new Eip1193SignerAdapter(provider);\n  };\n\n  return { getSigner, address, isConnected };\n}\n\nkeyManagement Namespace\n\nInteract with the SecretsController contract for secret management.\n\nRead Operations\n// Get secret creation fee\nconst fee = await keyManagement.getSecretCreationFee({\n  chainId: 752025,\n  controllerAddress: sdk.getControllerAddress(752025),\n  readClient: sdk.readClient,\n});\n\n// Get secret state\nconst state = await keyManagement.getSecret(params, 123n);\n// Returns: { owner, delegate, isSyncing, clusterId, secretType, publicKeyCid }\n\n// Check if secret is ready\nconst ready = await keyManagement.isSecretReady(params, 123n);\n\n// Check authorization\nconst canDecrypt = await keyManagement.isAuthorized(params, 123n, '0x...');\n\n// Get secrets by wallet\nconst secrets = await keyManagement.getSecretsByWallet(params, '0xUser...');\n// Returns: { owned: bigint[], delegated: bigint[] }\n\nTransaction Builders\n// Create a new secret\nconst fee = await keyManagement.getSecretCreationFee(params);\nconst txIntent = keyManagement.buildCreateSecretTx({\n  chainId: 752025,\n  controllerAddress: sdk.getControllerAddress(752025),\n  fee,\n});\n\n// Set delegate\nconst txIntent = keyManagement.buildSetDelegateTx({\n  chainId: 752025,\n  controllerAddress: sdk.getControllerAddress(752025),\n  secretId: 123n,\n  newDelegate: '0xDelegate...',\n});\n\n// Remove delegate\nconst txIntent = keyManagement.buildRemoveDelegationTx({ ... });\n\n// Transfer ownership (irreversible!)\nconst txIntent = keyManagement.buildTransferSecretTx({\n  chainId: 752025,\n  controllerAddress: sdk.getControllerAddress(752025),\n  secretId: 123n,\n  newOwner: '0xNewOwner...',\n});\n\nEvent Parsing\nconst receipt = await provider.waitForTransaction(hash);\nconst secretId = keyManagement.extractSecretIdFromReceipt(receipt.logs);\n\nblackbox.payload Namespace\n\nEncrypt and decrypt short messages (< 16KB).\n\nEncrypt\nconst encrypted = await blackbox.payload.encryptPayload({\n  chainId: 752025,\n  secretId: 123n,\n  plaintext: 'My secret message',\n  signer,\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n  outputFormat: 'hex', // or 'base64'\n});\n\n// Returns: { cifer: string, encryptedMessage: string }\n\nDecrypt\nconst decrypted = await blackbox.payload.decryptPayload({\n  chainId: 752025,\n  secretId: 123n,\n  encryptedMessage: encrypted.encryptedMessage,\n  cifer: encrypted.cifer,\n  signer, // Must be owner or delegate\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n  inputFormat: 'hex',\n});\n\n// Returns: { decryptedMessage: string }\n\nblackbox.files Namespace\n\nEncrypt and decrypt large files using async jobs.\n\n// Start encryption job\nconst job = await blackbox.files.encryptFile({\n  chainId: 752025,\n  secretId: 123n,\n  file: myFile,\n  signer,\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n});\n// Returns: { jobId: string, message: string }\n\n// Start decryption job\nconst job = await blackbox.files.decryptFile({ ... });\n\n// Decrypt from existing encrypt job\nconst job = await blackbox.files.decryptExistingFile({\n  chainId: 752025,\n  secretId: 123n,\n  encryptJobId: previousJobId,\n  signer,\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n});\n\nblackbox.jobs Namespace\n\nManage async file jobs.\n\n// Get job status\nconst status = await blackbox.jobs.getStatus(jobId, sdk.blackboxUrl);\n// Returns: { id, type, status, progress, secretId, chainId, ... }\n\n// Poll until complete\nconst finalStatus = await blackbox.jobs.pollUntilComplete(\n  jobId,\n  sdk.blackboxUrl,\n  {\n    intervalMs: 2000,\n    maxAttempts: 120,\n    onProgress: (job) => console.log(`Progress: ${job.progress}%`),\n  }\n);\n\n// Download result (encrypt jobs: no auth, decrypt jobs: auth required)\nconst blob = await blackbox.jobs.download(jobId, {\n  blackboxUrl: sdk.blackboxUrl,\n  // For decrypt jobs, also provide:\n  chainId: 752025,\n  secretId: 123n,\n  signer,\n  readClient: sdk.readClient,\n});\n\n// List jobs for wallet\nconst result = await blackbox.jobs.list({\n  chainId: 752025,\n  signer,\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n});\n\n// Get data consumption stats\nconst stats = await blackbox.jobs.dataConsumption({ ... });\n\ncommitments Namespace\n\nStore and retrieve encrypted data on-chain.\n\n// Check if commitment exists\nconst exists = await commitments.ciferDataExists(params, dataId);\n\n// Get metadata\nconst metadata = await commitments.getCIFERMetadata(params, dataId);\n// Returns: { secretId, storedAtBlock, ciferHash, encryptedMessageHash }\n\n// Fetch encrypted data from logs\nconst data = await commitments.fetchCommitmentFromLogs({\n  chainId: 752025,\n  contractAddress: '0x...',\n  dataId: dataKey,\n  storedAtBlock: metadata.storedAtBlock,\n  readClient: sdk.readClient,\n});\n// Returns: { cifer, encryptedMessage, ciferHash, encryptedMessageHash }\n\n// Verify integrity\nconst result = commitments.verifyCommitmentIntegrity(data, metadata);\n\n// Build store transaction\nconst txIntent = commitments.buildStoreCommitmentTx({\n  chainId: 752025,\n  contractAddress: '0xYourContract...',\n  storeFunction: {\n    type: 'function',\n    name: 'store',\n    inputs: [\n      { name: 'key', type: 'bytes32' },\n      { name: 'encryptedMessage', type: 'bytes' },\n      { name: 'cifer', type: 'bytes' },\n    ],\n  },\n  args: {\n    key: dataKey,\n    secretId: 123n,\n    encryptedMessage: encrypted.encryptedMessage,\n    cifer: encrypted.cifer,\n  },\n});\n\n\nConstants:\n\nCIFER_ENVELOPE_BYTES = 1104 (fixed cifer size)\nMAX_PAYLOAD_BYTES = 16384 (16KB max payload)\nflows Namespace\n\nHigh-level orchestrated operations.\n\nFlow Context\nconst ctx = {\n  signer: SignerAdapter,\n  readClient: ReadClient,\n  blackboxUrl: string,\n  chainId: number,\n  controllerAddress?: Address,\n  txExecutor?: (intent: TxIntent) => Promise<TxExecutionResult>,\n  pollingStrategy?: { intervalMs: number, maxAttempts: number },\n  logger?: (message: string) => void,\n  abortSignal?: AbortSignal,\n};\n\nCreate Secret and Wait\nconst result = await flows.createSecretAndWaitReady({\n  ...ctx,\n  controllerAddress: sdk.getControllerAddress(752025),\n  txExecutor: async (intent) => {\n    const hash = await wallet.sendTransaction(intent);\n    return { hash, waitReceipt: () => provider.waitForTransaction(hash) };\n  },\n});\n\nif (result.success) {\n  console.log('Secret ID:', result.data.secretId);\n  console.log('Public Key CID:', result.data.state.publicKeyCid);\n}\n\nEncrypt and Prepare Commit\nconst result = await flows.encryptThenPrepareCommitTx(ctx, {\n  secretId: 123n,\n  plaintext: 'My secret data',\n  key: dataKey,\n  commitmentContract: '0x...',\n});\n\nif (result.success) {\n  await wallet.sendTransaction(result.data.txIntent);\n}\n\nRetrieve and Decrypt from Logs\nconst result = await flows.retrieveFromLogsThenDecrypt(ctx, {\n  secretId: 123n,\n  dataId: dataKey,\n  commitmentContract: '0x...',\n});\n\nif (result.success) {\n  console.log('Decrypted:', result.data.decryptedMessage);\n}\n\nFile Flows\n// Encrypt file flow\nconst result = await flows.encryptFileJobFlow(ctx, {\n  secretId: 123n,\n  file: myFile,\n});\n// Returns: { jobId, job, encryptedFile: Blob }\n\n// Decrypt file flow\nconst result = await flows.decryptFileJobFlow(ctx, {\n  secretId: 123n,\n  file: ciferFile,\n});\n// Returns: { jobId, job, decryptedFile: Blob }\n\nError Handling\n\nAll SDK errors extend CiferError with typed subclasses:\n\nCiferError\n├── ConfigError\n│   ├── DiscoveryError\n│   └── ChainNotSupportedError\n├── AuthError\n│   ├── SignatureError\n│   ├── BlockStaleError\n│   └── SignerMismatchError\n├── BlackboxError\n│   ├── EncryptionError\n│   ├── DecryptionError\n│   ├── JobError\n│   └── SecretNotReadyError\n├── KeyManagementError\n│   ├── SecretNotFoundError\n│   └── NotAuthorizedError\n├── CommitmentsError\n│   ├── CommitmentNotFoundError\n│   ├── IntegrityError\n│   ├── InvalidCiferSizeError\n│   └── PayloadTooLargeError\n└── FlowError\n    ├── FlowAbortedError\n    └── FlowTimeoutError\n\nType Guards\nimport {\n  isCiferError,\n  isBlockStaleError,\n  isSecretNotReadyError,\n} from 'cifer-sdk';\n\nError Handling Example\ntry {\n  await blackbox.payload.encryptPayload({ ... });\n} catch (error) {\n  if (isBlockStaleError(error)) {\n    console.log('RPC returning stale blocks');\n  } else if (error instanceof SecretNotReadyError) {\n    console.log('Wait for secret to sync');\n  } else if (error instanceof SecretNotFoundError) {\n    console.log('Secret not found:', error.secretId);\n  } else if (isCiferError(error)) {\n    console.log('CIFER error:', error.code, error.message);\n  } else {\n    throw error;\n  }\n}\n\nCommon Scenarios\nError\tCause\tSolution\n\"Block number is too old\"\tRPC issues\tSDK auto-retries 3x; check RPC reliability\n\"Secret is syncing\"\tKey generation in progress\tWait 30-60s; use isSecretReady()\n\"Signature verification failed\"\tWrong signing method\tUse EIP-191 personal_sign\n\"Not authorized\"\tNot owner/delegate\tCheck with isAuthorized()\nComplete Examples\nBrowser: Encrypt/Decrypt Message\nimport { createCiferSdk, Eip1193SignerAdapter, blackbox } from 'cifer-sdk';\n\nasync function encryptDecryptExample() {\n  const sdk = await createCiferSdk({\n    blackboxUrl: 'https://blackbox.cifer.network',\n  });\n  const signer = new Eip1193SignerAdapter(window.ethereum);\n  \n  const chainId = 752025;\n  const secretId = 123n;\n  \n  // Encrypt\n  const encrypted = await blackbox.payload.encryptPayload({\n    chainId,\n    secretId,\n    plaintext: 'Hello, CIFER!',\n    signer,\n    readClient: sdk.readClient,\n    blackboxUrl: sdk.blackboxUrl,\n  });\n  \n  // Decrypt\n  const decrypted = await blackbox.payload.decryptPayload({\n    chainId,\n    secretId,\n    encryptedMessage: encrypted.encryptedMessage,\n    cifer: encrypted.cifer,\n    signer,\n    readClient: sdk.readClient,\n    blackboxUrl: sdk.blackboxUrl,\n  });\n  \n  console.log('Decrypted:', decrypted.decryptedMessage);\n}\n\nNode.js Server-Side\nimport { createCiferSdk, RpcReadClient, blackbox } from 'cifer-sdk';\nimport { Wallet } from 'ethers';\n\nasync function serverSideExample() {\n  const readClient = new RpcReadClient({\n    rpcUrlByChainId: {\n      752025: 'https://mainnet.ternoa.network',\n    },\n  });\n  \n  const sdk = await createCiferSdk({\n    blackboxUrl: 'https://blackbox.cifer.network',\n    readClient,\n  });\n  \n  const wallet = new Wallet(process.env.PRIVATE_KEY);\n  const signer = {\n    async getAddress() { return wallet.address; },\n    async signMessage(message) { return wallet.signMessage(message); },\n  };\n  \n  const encrypted = await blackbox.payload.encryptPayload({\n    chainId: 752025,\n    secretId: 123n,\n    plaintext: 'Server-side encryption',\n    signer,\n    readClient: sdk.readClient,\n    blackboxUrl: sdk.blackboxUrl,\n  });\n  \n  console.log('Encrypted on server:', encrypted);\n}\n\nFile Encryption with Progress\nimport { createCiferSdk, Eip1193SignerAdapter, blackbox } from 'cifer-sdk';\n\nasync function fileEncryptionExample() {\n  const sdk = await createCiferSdk({\n    blackboxUrl: 'https://blackbox.cifer.network',\n  });\n  const signer = new Eip1193SignerAdapter(window.ethereum);\n  \n  const file = document.getElementById('fileInput').files[0];\n  \n  // Start job\n  const job = await blackbox.files.encryptFile({\n    chainId: 752025,\n    secretId: 123n,\n    file,\n    signer,\n    readClient: sdk.readClient,\n    blackboxUrl: sdk.blackboxUrl,\n  });\n  \n  // Poll with progress\n  const finalStatus = await blackbox.jobs.pollUntilComplete(\n    job.jobId,\n    sdk.blackboxUrl,\n    {\n      onProgress: (status) => console.log(`Progress: ${status.progress}%`),\n    }\n  );\n  \n  if (finalStatus.status === 'completed') {\n    const encryptedBlob = await blackbox.jobs.download(job.jobId, {\n      blackboxUrl: sdk.blackboxUrl,\n    });\n    \n    // Download file\n    const url = URL.createObjectURL(encryptedBlob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = 'encrypted.cifer';\n    a.click();\n  }\n}\n\nType Definitions\ntype Address = `0x${string}`;\ntype Bytes32 = `0x${string}`;\ntype Hex = `0x${string}`;\ntype ChainId = number;\ntype SecretId = bigint;\ntype OutputFormat = 'hex' | 'base64';\ntype JobStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'expired';\ntype JobType = 'encrypt' | 'decrypt';\n\ninterface SecretState {\n  owner: Address;\n  delegate: Address;\n  isSyncing: boolean;\n  clusterId: number;\n  secretType: number;\n  publicKeyCid: string;\n}\n\ninterface JobInfo {\n  id: string;\n  type: JobType;\n  status: JobStatus;\n  progress: number;\n  secretId: number;\n  chainId: ChainId;\n  createdAt: number;\n  completedAt?: number;\n  error?: string;\n  resultFileName?: string;\n  ttl: number;\n  originalSize?: number;\n}\n\ninterface FlowResult<T> {\n  success: boolean;\n  plan: FlowPlan;\n  data?: T;\n  error?: Error;\n  receipts?: TransactionReceipt[];\n}\n\nResources\nnpm: https://www.npmjs.com/package/cifer-sdk\nGitHub: https://github.com/cifer-security/cifer-sdk\nBlackbox API: https://blackbox.cifer.network\nSupported Chain: Ternoa (752025)\n\nThis skill enables AI agents to implement quantum-resistant encryption in blockchain applications using the CIFER SDK."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/mohsinriaz17/cifer-sdk",
    "publisherUrl": "https://clawhub.ai/mohsinriaz17/cifer-sdk",
    "owner": "mohsinriaz17",
    "version": "0.3.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/cifer-sdk",
    "downloadUrl": "https://openagent3.xyz/downloads/cifer-sdk",
    "agentUrl": "https://openagent3.xyz/skills/cifer-sdk/agent",
    "manifestUrl": "https://openagent3.xyz/skills/cifer-sdk/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/cifer-sdk/agent.md"
  }
}