[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6PY0TTD8KPBY8FQ6EPRH9VY":3,"skill-same:01M6PY0TTD8KPBY8FQ6EPRH9VY":51},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":14,"categories":15,"keywords":16,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":26,"repositoryHtmlUrl":27,"repositoryHomepageUrl":6,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":29,"updatedAt":30,"install":31,"resources":44},"01M6PY0TTD8KPBY8FQ6EPRH9VY","cifer-sdk",null,"Kernel8901\u002Fai-agent-skills-classification","Kernel8901","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F72647553?v=4","01M6KV388J2H5PNC8D8P940BJD","01M6KV38CS5B3AY63RKZB410YM",7,"MIT","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F安全与密码\u002Fcifer-sdk\u002Fskill.md",[],[17,18],"sdk","cifer sdk","2026-11-10 10:12:30",false,"# CIFER SDK - Quantum-Resistant Blockchain Encryption\n\n> **Skill for AI Agents** | Enable quantum-resistant encryption in blockchain applications using the CIFER SDK.\n\n## Overview\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\n### Key Capabilities\n\n- **Quantum-Resistant Encryption**: ML-KEM-768 (NIST standardized) key encapsulation\n- **Multi-Chain Support**: Automatic chain discovery and configuration\n- **Wallet Agnostic**: Works with MetaMask, WalletConnect, Coinbase, Thirdweb, and custom signers\n- **File Encryption**: Async job system for large file encryption\u002Fdecryption\n- **On-Chain Commitments**: Store encrypted data references on-chain with log-based retrieval\n- **Transaction Intents**: Non-custodial pattern - you control transaction execution\n\n## When to Use This Skill\n\nUse the CIFER SDK when you need to:\n\n- Encrypt sensitive data with quantum-resistant algorithms\n- Store encrypted records on blockchain\n- Manage encryption keys with owner\u002Fdelegate authorization\n- Encrypt files larger than 16KB using the job system\n- Build applications requiring post-quantum security\n\n## Installation\n\n```bash\nnpm install cifer-sdk\n# or\nyarn add cifer-sdk\n# or\npnpm add cifer-sdk\n```\n\n**Requirements**: Node.js 18.0+, TypeScript 5.0+ (recommended)\n\n## Quick Start\n\n```typescript\nimport { createCiferSdk, Eip1193SignerAdapter, blackbox } from 'cifer-sdk';\n\n\u002F\u002F 1. Initialize SDK with auto-discovery\nconst sdk = await createCiferSdk({\n  blackboxUrl: 'https:\u002F\u002Fblackbox.cifer.network',\n});\n\n\u002F\u002F 2. Connect wallet (browser)\nconst signer = new Eip1193SignerAdapter(window.ethereum);\n\n\u002F\u002F 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\u002F\u002F 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); \u002F\u002F 'My secret message'\n```\n\n---\n\n## Core Concepts\n\n### Secrets\n\nA **secret** is the core primitive in CIFER. Each secret represents an ML-KEM-768 key pair:\n\n| Property | Description |\n|----------|-------------|\n| `owner` | Address that can transfer, set delegate, and decrypt |\n| `delegate` | Address that can decrypt only (zero address if none) |\n| `isSyncing` | `true` while key generation is in progress |\n| `clusterId` | Which enclave cluster holds the private key shards |\n| `secretType` | `1` = ML-KEM-768 (standard) |\n| `publicKeyCid` | IPFS CID of public key (empty if syncing) |\n\n**Lifecycle**: Creation → Syncing (~30-60s) → Ready\n\n### Authorization Model\n\n| Role | Capabilities |\n|------|-------------|\n| **Owner** | Encrypt, decrypt, transfer, set delegate |\n| **Delegate** | Decrypt only |\n\n### Encryption Model\n\nCIFER uses hybrid encryption:\n1. **ML-KEM-768**: Post-quantum key encapsulation (1088-byte ciphertext)\n2. **AES-256-GCM**: Symmetric encryption for actual data\n\nOutput format:\n- `cifer`: 1104 bytes (ML-KEM ciphertext + tag)\n- `encryptedMessage`: Variable length (max 16KB)\n\n### Transaction Intents\n\nThe SDK returns transaction intents instead of executing transactions:\n\n```typescript\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\n---\n\n## API Reference\n\n### SDK Initialization\n\n#### With Discovery (Recommended)\n\n```typescript\nconst sdk = await createCiferSdk({\n  blackboxUrl: 'https:\u002F\u002Fblackbox.cifer.network',\n});\n\nsdk.getSupportedChainIds(); \u002F\u002F [752025, 11155111, ...]\nsdk.getControllerAddress(752025); \u002F\u002F '0x...'\nsdk.getRpcUrl(752025); \u002F\u002F 'https:\u002F\u002F...'\n```\n\n#### With Overrides\n\n```typescript\nconst sdk = await createCiferSdk({\n  blackboxUrl: 'https:\u002F\u002Fblackbox.cifer.network',\n  chainOverrides: {\n    752025: {\n      rpcUrl: 'https:\u002F\u002Fmy-private-rpc.example.com',\n      secretsControllerAddress: '0x...',\n    },\n  },\n});\n```\n\n#### Synchronous (No Discovery)\n\n```typescript\nimport { createCiferSdkSync, RpcReadClient } from 'cifer-sdk';\n\nconst readClient = new RpcReadClient({\n  rpcUrlByChainId: {\n    752025: 'https:\u002F\u002Fmainnet.ternoa.network',\n  },\n});\n\nconst sdk = createCiferSdkSync({\n  blackboxUrl: 'https:\u002F\u002Fblackbox.cifer.network',\n  readClient,\n  chainOverrides: {\n    752025: {\n      rpcUrl: 'https:\u002F\u002Fmainnet.ternoa.network',\n      secretsControllerAddress: '0x...',\n    },\n  },\n});\n```\n\n---\n\n### Wallet Integration\n\nAll wallets must implement the `SignerAdapter` interface:\n\n```typescript\ninterface SignerAdapter {\n  getAddress(): Promise\u003Cstring>;\n  signMessage(message: string): Promise\u003Cstring>;\n  sendTransaction?(txRequest: TxIntent): Promise\u003CTxExecutionResult>;\n}\n```\n\n#### MetaMask\n\n```typescript\nimport { Eip1193SignerAdapter } from 'cifer-sdk';\n\nawait window.ethereum.request({ method: 'eth_requestAccounts' });\nconst signer = new Eip1193SignerAdapter(window.ethereum);\n```\n\n#### WalletConnect v2\n\n```typescript\nimport { EthereumProvider } from '@walletconnect\u002Fethereum-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```\n\n#### Private Key (Server-Side)\n\n```typescript\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```\n\n#### wagmi (React)\n\n```typescript\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```\n\n---\n\n### keyManagement Namespace\n\nInteract with the SecretsController contract for secret management.\n\n#### Read Operations\n\n```typescript\n\u002F\u002F Get secret creation fee\nconst fee = await keyManagement.getSecretCreationFee({\n  chainId: 752025,\n  controllerAddress: sdk.getControllerAddress(752025),\n  readClient: sdk.readClient,\n});\n\n\u002F\u002F Get secret state\nconst state = await keyManagement.getSecret(params, 123n);\n\u002F\u002F Returns: { owner, delegate, isSyncing, clusterId, secretType, publicKeyCid }\n\n\u002F\u002F Check if secret is ready\nconst ready = await keyManagement.isSecretReady(params, 123n);\n\n\u002F\u002F Check authorization\nconst canDecrypt = await keyManagement.isAuthorized(params, 123n, '0x...');\n\n\u002F\u002F Get secrets by wallet\nconst secrets = await keyManagement.getSecretsByWallet(params, '0xUser...');\n\u002F\u002F Returns: { owned: bigint[], delegated: bigint[] }\n```\n\n#### Transaction Builders\n\n```typescript\n\u002F\u002F 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\u002F\u002F Set delegate\nconst txIntent = keyManagement.buildSetDelegateTx({\n  chainId: 752025,\n  controllerAddress: sdk.getControllerAddress(752025),\n  secretId: 123n,\n  newDelegate: '0xDelegate...',\n});\n\n\u002F\u002F Remove delegate\nconst txIntent = keyManagement.buildRemoveDelegationTx({ ... });\n\n\u002F\u002F Transfer ownership (irreversible!)\nconst txIntent = keyManagement.buildTransferSecretTx({\n  chainId: 752025,\n  controllerAddress: sdk.getControllerAddress(752025),\n  secretId: 123n,\n  newOwner: '0xNewOwner...',\n});\n```\n\n#### Event Parsing\n\n```typescript\nconst receipt = await provider.waitForTransaction(hash);\nconst secretId = keyManagement.extractSecretIdFromReceipt(receipt.logs);\n```\n\n---\n\n### blackbox.payload Namespace\n\nEncrypt and decrypt short messages (\u003C 16KB).\n\n#### Encrypt\n\n```typescript\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', \u002F\u002F or 'base64'\n});\n\n\u002F\u002F Returns: { cifer: string, encryptedMessage: string }\n```\n\n#### Decrypt\n\n```typescript\nconst decrypted = await blackbox.payload.decryptPayload({\n  chainId: 752025,\n  secretId: 123n,\n  encryptedMessage: encrypted.encryptedMessage,\n  cifer: encrypted.cifer,\n  signer, \u002F\u002F Must be owner or delegate\n  readClient: sdk.readClient,\n  blackboxUrl: sdk.blackboxUrl,\n  inputFormat: 'hex',\n});\n\n\u002F\u002F Returns: { decryptedMessage: string }\n```\n\n---\n\n### blackbox.files Namespace\n\nEncrypt and decrypt large files using async jobs.\n\n```typescript\n\u002F\u002F 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\u002F\u002F Returns: { jobId: string, message: string }\n\n\u002F\u002F Start decryption job\nconst job = await blackbox.files.decryptFile({ ... });\n\n\u002F\u002F 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```\n\n---\n\n### blackbox.jobs Namespace\n\nManage async file jobs.\n\n```typescript\n\u002F\u002F Get job status\nconst status = await blackbox.jobs.getStatus(jobId, sdk.blackboxUrl);\n\u002F\u002F Returns: { id, type, status, progress, secretId, chainId, ... }\n\n\u002F\u002F 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\u002F\u002F Download result (encrypt jobs: no auth, decrypt jobs: auth required)\nconst blob = await blackbox.jobs.download(jobId, {\n  blackboxUrl: sdk.blackboxUrl,\n  \u002F\u002F For decrypt jobs, also provide:\n  chainId: 752025,\n  secretId: 123n,\n  signer,\n  readClient: sdk.readClient,\n});\n\n\u002F\u002F 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\u002F\u002F Get data consumption stats\nconst stats = await blackbox.jobs.dataConsumption({ ... });\n```\n\n---\n\n### commitments Namespace\n\nStore and retrieve encrypted data on-chain.\n\n```typescript\n\u002F\u002F Check if commitment exists\nconst exists = await commitments.ciferDataExists(params, dataId);\n\n\u002F\u002F Get metadata\nconst metadata = await commitments.getCIFERMetadata(params, dataId);\n\u002F\u002F Returns: { secretId, storedAtBlock, ciferHash, encryptedMessageHash }\n\n\u002F\u002F 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\u002F\u002F Returns: { cifer, encryptedMessage, ciferHash, encryptedMessageHash }\n\n\u002F\u002F Verify integrity\nconst result = commitments.verifyCommitmentIntegrity(data, metadata);\n\n\u002F\u002F 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\n**Constants**:\n- `CIFER_ENVELOPE_BYTES = 1104` (fixed cifer size)\n- `MAX_PAYLOAD_BYTES = 16384` (16KB max payload)\n\n---\n\n### flows Namespace\n\nHigh-level orchestrated operations.\n\n#### Flow Context\n\n```typescript\nconst ctx = {\n  signer: SignerAdapter,\n  readClient: ReadClient,\n  blackboxUrl: string,\n  chainId: number,\n  controllerAddress?: Address,\n  txExecutor?: (intent: TxIntent) => Promise\u003CTxExecutionResult>,\n  pollingStrategy?: { intervalMs: number, maxAttempts: number },\n  logger?: (message: string) => void,\n  abortSignal?: AbortSignal,\n};\n```\n\n#### Create Secret and Wait\n\n```typescript\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```\n\n#### Encrypt and Prepare Commit\n\n```typescript\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```\n\n#### Retrieve and Decrypt from Logs\n\n```typescript\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```\n\n#### File Flows\n\n```typescript\n\u002F\u002F Encrypt file flow\nconst result = await flows.encryptFileJobFlow(ctx, {\n  secretId: 123n,\n  file: myFile,\n});\n\u002F\u002F Returns: { jobId, job, encryptedFile: Blob }\n\n\u002F\u002F Decrypt file flow\nconst result = await flows.decryptFileJobFlow(ctx, {\n  secretId: 123n,\n  file: ciferFile,\n});\n\u002F\u002F Returns: { jobId, job, decryptedFile: Blob }\n```\n\n---\n\n## Error Handling\n\nAll SDK errors extend `CiferError` with typed subclasses:\n\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```\n\n### Type Guards\n\n```typescript\nimport {\n  isCiferError,\n  isBlockStaleError,\n  isSecretNotReadyError,\n} from 'cifer-sdk';\n```\n\n### Error Handling Example\n\n```typescript\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```\n\n### Common Scenarios\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| \"Block number is too old\" | RPC issues | SDK auto-retries 3x; check RPC reliability |\n| \"Secret is syncing\" | Key generation in progress | Wait 30-60s; use `isSecretReady()` |\n| \"Signature verification failed\" | Wrong signing method | Use EIP-191 `personal_sign` |\n| \"Not authorized\" | Not owner\u002Fdelegate | Check with `isAuthorized()` |\n\n---\n\n## Complete Examples\n\n### Browser: Encrypt\u002FDecrypt Message\n\n```typescript\nimport { createCiferSdk, Eip1193SignerAdapter, blackbox } from 'cifer-sdk';\n\nasync function encryptDecryptExample() {\n  const sdk = await createCiferSdk({\n    blackboxUrl: 'https:\u002F\u002Fblackbox.cifer.network',\n  });\n  const signer = new Eip1193SignerAdapter(window.ethereum);\n  \n  const chainId = 752025;\n  const secretId = 123n;\n  \n  \u002F\u002F 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  \u002F\u002F 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```\n\n### Node.js Server-Side\n\n```typescript\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:\u002F\u002Fmainnet.ternoa.network',\n    },\n  });\n  \n  const sdk = await createCiferSdk({\n    blackboxUrl: 'https:\u002F\u002Fblackbox.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```\n\n### File Encryption with Progress\n\n```typescript\nimport { createCiferSdk, Eip1193SignerAdapter, blackbox } from 'cifer-sdk';\n\nasync function fileEncryptionExample() {\n  const sdk = await createCiferSdk({\n    blackboxUrl: 'https:\u002F\u002Fblackbox.cifer.network',\n  });\n  const signer = new Eip1193SignerAdapter(window.ethereum);\n  \n  const file = document.getElementById('fileInput').files[0];\n  \n  \u002F\u002F 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  \u002F\u002F 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    \u002F\u002F 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```\n\n---\n\n## Type Definitions\n\n```typescript\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\u003CT> {\n  success: boolean;\n  plan: FlowPlan;\n  data?: T;\n  error?: Error;\n  receipts?: TransactionReceipt[];\n}\n```\n\n---\n\n## Resources\n\n- **npm**: [https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fcifer-sdk](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fcifer-sdk)\n- **GitHub**: [https:\u002F\u002Fgithub.com\u002Fcifer-security\u002Fcifer-sdk](https:\u002F\u002Fgithub.com\u002Fcifer-security\u002Fcifer-sdk)\n- **Blackbox API**: `https:\u002F\u002Fblackbox.cifer.network`\n- **Supported Chain**: Ternoa (752025)\n\n---\n\n*This skill enables AI agents to implement quantum-resistant encryption in blockchain applications using the CIFER SDK.*\n",{},"main","f4cb2d49f7667e79ef7804f50396d5aaffdf1f56","安全与密码\u002Fcifer-sdk",1,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification","https:\u002F\u002Fgithub.com\u002FKernel8901","a little little little dobe in life but science geek","2026-04-05 16:43:56",{"source":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add Kernel8901\u002Fai-agent-skills-classification --skill cifer-sdk",{"tool":37,"command":38},"bunx","bunx skills add Kernel8901\u002Fai-agent-skills-classification --skill cifer-sdk",{"tool":40,"command":41},"pnpm","pnpm dlx skills add Kernel8901\u002Fai-agent-skills-classification --skill cifer-sdk","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F安全与密码\u002Fcifer-sdk\u002Fskill.md",true,[45],{"path":46,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":49,"sourceHtmlUrl":50},"_meta.json","REFERENCE","参考文档",276,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F安全与密码\u002Fcifer-sdk\u002F_meta.json",[52,76,112,123,133,163],{"skillNo":53,"name":54,"nameZh":6,"description":55,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":58,"publishedAt":19},"01M6Q5R6WZ06RRB9RQTW54B34B","zyfai","Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount (Safe) linked to their EOA, enables automated yield optimization, and lets them deposit\u002Fwithdraw anytime.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzyfai-sdk\u002FSKILL.md",[],[54,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75],"safe","ethereum","defi","Optimization","user","use","Wallet","base","deposit","withdraw","yield","arbitrum","non-custodial","passive","defi yield","earn","yield optimization",{"skillNo":77,"name":78,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":94,"publishedAt":19},"01M6Q5R337B5JSNER4P4YS03TN","zerion-api","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api\u002FSKILL.md",[81,86,89],{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":87,"categoryName":88,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":90,"categoryName":91,"taxonomyType":92,"taxonomyTypeDesc":93},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[95,96,97,98,99,100,101,61,102,65,103,104,105,106,107,108,109,110,111],"api","zerion api","zerion","MCP","mcp server","server","blockchain","transactions","crypto wallet","crypto","evm","solana","query","across","positions","token","prices",{"skillNo":113,"name":114,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":120,"publishedAt":19},"01M6Q5QZFYTDAZMZ27BN5VZXAR","zerion-api-skill","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-skill\u002FSKILL.md",[117,118,119],{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},{"categoryNo":87,"categoryName":88,"taxonomyType":84,"taxonomyTypeDesc":85},{"categoryNo":90,"categoryName":91,"taxonomyType":92,"taxonomyTypeDesc":93},[95,121,122,96,97,98,99,100,101,61,102,65,104,105,106,107,108,109,110,111],"api skill","zerion api skill",{"skillNo":124,"name":125,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":131,"publishedAt":19},"01M6Q5QW17QW98RA3FE45E4RD8","zerion-api-mcp","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-mcp\u002FSKILL.md",[128,129,130],{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},{"categoryNo":87,"categoryName":88,"taxonomyType":84,"taxonomyTypeDesc":85},{"categoryNo":90,"categoryName":91,"taxonomyType":92,"taxonomyTypeDesc":93},[98,95,132,96,97,99,100,61,102,65,103,104,105,106,107,108,109,110,111],"zerion api mcp",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":142,"publishedAt":19},"01M6Q5QQYZB7A501BDEQWKGSJT","yahoo-finance-forex","Fetches real-time FOREX news and market data from Yahoo Finance for major currency pairs (EUR\u002FUSD, GBP\u002FUSD, USD\u002FJPY, etc.). Analyzes sentiment and provides trading context.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-forex\u002FSKILL.md",[139],{"categoryNo":140,"categoryName":141,"taxonomyType":92,"taxonomyTypeDesc":93},"01JBSEEDCAT000000000000040","财务",[143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162],"finance","yahoo finance","forex","yahoo","yahoo finance forex","github","https","sentiment","real-time","python3","install","Market","usd","news","time","currency","gbp","pip","market data","for",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":170,"publishedAt":19},"01M6Q5QM6VS84WZVM7BKXXPF32","yahoo-finance","This skill should be used when the user asks to \"get stock prices\", \"check stock quotes\", \"look up earnings\", \"get financial data\", \"find trending stocks\", or needs stock market data from Yahoo Finance.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-cli\u002FSKILL.md",[169],{"categoryNo":140,"categoryName":141,"taxonomyType":92,"taxonomyTypeDesc":93},[143,144,146,171,172,173,174,175,176,154,177,178,179,180,181,182,183,184,111,161],"cli","homebrew","find","check","brew","up","local","get","stock","link","trending","sf","quotes","ln"]