@blindmarket/sdk 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -0
- package/biome.json +19 -0
- package/dist/BlindEscrowClient-CyPuKMge.d.cts +54 -0
- package/dist/BlindEscrowClient-R7iGpE-n.d.ts +54 -0
- package/dist/KeyStore-Be_SSpCt.d.cts +21 -0
- package/dist/KeyStore-k1JgYPJY.d.ts +21 -0
- package/dist/Signer-BnqH_qew.d.cts +38 -0
- package/dist/Signer-LColE0Uo.d.ts +38 -0
- package/dist/Storage-4QOrh7rm.d.ts +17 -0
- package/dist/Storage-Cf4IJRMk.d.cts +17 -0
- package/dist/TaskRegistryClient-Ch6lYqM_.d.ts +24 -0
- package/dist/TaskRegistryClient-CrQjddDc.d.cts +24 -0
- package/dist/aes-J-7HrHze.d.cts +17 -0
- package/dist/aes-J-7HrHze.d.ts +17 -0
- package/dist/agent/Agent.d.ts +59 -0
- package/dist/agent/Agent.js +73 -0
- package/dist/agent/index.cjs +425 -0
- package/dist/agent/index.cjs.map +1 -0
- package/dist/agent/index.d.cts +63 -0
- package/dist/agent/index.d.ts +1 -0
- package/dist/agent/index.js +1 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/api/index.cjs +4 -0
- package/dist/api/index.cjs.map +1 -0
- package/dist/api/index.d.cts +2 -0
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.js +1 -0
- package/dist/api/index.js.map +1 -0
- package/dist/chain/BlindEscrowClient.d.ts +51 -0
- package/dist/chain/BlindEscrowClient.js +142 -0
- package/dist/chain/BlindReputationClient.d.ts +16 -0
- package/dist/chain/BlindReputationClient.js +45 -0
- package/dist/chain/ChainClient.d.ts +26 -0
- package/dist/chain/ChainClient.js +46 -0
- package/dist/chain/TaskRegistryClient.d.ts +21 -0
- package/dist/chain/TaskRegistryClient.js +70 -0
- package/dist/chain/abi/BlindEscrow.json +1113 -0
- package/dist/chain/abi/BlindReputation.json +447 -0
- package/dist/chain/abi/TaskRegistry.json +586 -0
- package/dist/chain/abi/index.d.ts +4 -0
- package/dist/chain/abi/index.js +4 -0
- package/dist/chain/errors.d.ts +8 -0
- package/dist/chain/errors.js +32 -0
- package/dist/chain/index.cjs +2484 -0
- package/dist/chain/index.cjs.map +1 -0
- package/dist/chain/index.d.cts +2305 -0
- package/dist/chain/index.d.ts +6 -0
- package/dist/chain/index.js +6 -0
- package/dist/chain/index.js.map +1 -0
- package/dist/compute/index.cjs +4 -0
- package/dist/compute/index.cjs.map +1 -0
- package/dist/compute/index.d.cts +2 -0
- package/dist/compute/index.d.ts +1 -0
- package/dist/compute/index.js +1 -0
- package/dist/compute/index.js.map +1 -0
- package/dist/crypto/aes.d.ts +15 -0
- package/dist/crypto/aes.js +81 -0
- package/dist/crypto/constants.d.ts +7 -0
- package/dist/crypto/constants.js +7 -0
- package/dist/crypto/ecies.d.ts +8 -0
- package/dist/crypto/ecies.js +51 -0
- package/dist/crypto/envelope.d.ts +35 -0
- package/dist/crypto/envelope.js +103 -0
- package/dist/crypto/hkdf.d.ts +5 -0
- package/dist/crypto/hkdf.js +34 -0
- package/dist/crypto/index.cjs +424 -0
- package/dist/crypto/index.cjs.map +1 -0
- package/dist/crypto/index.d.cts +74 -0
- package/dist/crypto/index.d.ts +6 -0
- package/dist/crypto/index.js +6 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/keys.d.ts +12 -0
- package/dist/crypto/keys.js +42 -0
- package/dist/errors/BlindBountyError.d.ts +14 -0
- package/dist/errors/BlindBountyError.js +30 -0
- package/dist/errors/codes.d.ts +19 -0
- package/dist/errors/codes.js +48 -0
- package/dist/errors/index.cjs +136 -0
- package/dist/errors/index.cjs.map +1 -0
- package/dist/errors/index.d.cts +60 -0
- package/dist/errors/index.d.ts +3 -0
- package/dist/errors/index.js +3 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/subclasses.d.ts +26 -0
- package/dist/errors/subclasses.js +41 -0
- package/dist/events/EventBus.d.ts +13 -0
- package/dist/events/EventBus.js +41 -0
- package/dist/events/index.cjs +41 -0
- package/dist/events/index.cjs.map +1 -0
- package/dist/events/index.d.cts +61 -0
- package/dist/events/index.d.ts +2 -0
- package/dist/events/index.js +2 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +45 -0
- package/dist/events/types.js +1 -0
- package/dist/index.cjs +4 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +129 -0
- package/dist/index.js +154 -0
- package/dist/index.js.map +1 -0
- package/dist/keystore/InMemoryKeyStore.d.ts +21 -0
- package/dist/keystore/InMemoryKeyStore.js +111 -0
- package/dist/keystore/KeyStore.d.ts +18 -0
- package/dist/keystore/KeyStore.js +1 -0
- package/dist/keystore/index.cjs +335 -0
- package/dist/keystore/index.cjs.map +1 -0
- package/dist/keystore/index.d.cts +23 -0
- package/dist/keystore/index.d.ts +2 -0
- package/dist/keystore/index.js +2 -0
- package/dist/keystore/index.js.map +1 -0
- package/dist/network/index.cjs +74 -0
- package/dist/network/index.cjs.map +1 -0
- package/dist/network/index.d.cts +36 -0
- package/dist/network/index.d.ts +3 -0
- package/dist/network/index.js +3 -0
- package/dist/network/index.js.map +1 -0
- package/dist/network/presets.d.ts +24 -0
- package/dist/network/presets.js +23 -0
- package/dist/network/resolve.d.ts +7 -0
- package/dist/network/resolve.js +17 -0
- package/dist/network/types.d.ts +16 -0
- package/dist/network/types.js +1 -0
- package/dist/signer/EthersSigner.d.ts +24 -0
- package/dist/signer/EthersSigner.js +68 -0
- package/dist/signer/PrivateKeySigner.d.ts +14 -0
- package/dist/signer/PrivateKeySigner.js +18 -0
- package/dist/signer/Signer.d.ts +35 -0
- package/dist/signer/Signer.js +1 -0
- package/dist/signer/index.cjs +121 -0
- package/dist/signer/index.cjs.map +1 -0
- package/dist/signer/index.d.cts +40 -0
- package/dist/signer/index.d.ts +3 -0
- package/dist/signer/index.js +3 -0
- package/dist/signer/index.js.map +1 -0
- package/dist/storage/MemoryStorage.d.ts +18 -0
- package/dist/storage/MemoryStorage.js +40 -0
- package/dist/storage/Storage.d.ts +14 -0
- package/dist/storage/Storage.js +1 -0
- package/dist/storage/ZgStorage.d.ts +24 -0
- package/dist/storage/ZgStorage.js +102 -0
- package/dist/storage/index.cjs +221 -0
- package/dist/storage/index.cjs.map +1 -0
- package/dist/storage/index.d.cts +44 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.js +3 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/testing/index.cjs +4 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +2 -0
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.js +1 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/types-BOG5Ub1z.d.cts +31 -0
- package/dist/types-BOG5Ub1z.d.ts +31 -0
- package/dist/types-V7_ZmUb-.d.cts +19 -0
- package/dist/types-hAsITUQ7.d.ts +19 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.js +1 -0
- package/dist/verifier/index.cjs +4 -0
- package/dist/verifier/index.cjs.map +1 -0
- package/dist/verifier/index.d.cts +2 -0
- package/dist/verifier/index.d.ts +1 -0
- package/dist/verifier/index.js +1 -0
- package/dist/verifier/index.js.map +1 -0
- package/dist/worker/Worker.d.ts +53 -0
- package/dist/worker/Worker.js +53 -0
- package/dist/worker/index.cjs +382 -0
- package/dist/worker/index.cjs.map +1 -0
- package/dist/worker/index.d.cts +58 -0
- package/dist/worker/index.d.ts +1 -0
- package/dist/worker/index.js +1 -0
- package/dist/worker/index.js.map +1 -0
- package/examples/agent-demo.ts +121 -0
- package/package.json +46 -0
- package/scripts/gen-crypto-fixtures.mjs +72 -0
- package/src/agent/Agent.ts +122 -0
- package/src/agent/index.ts +1 -0
- package/src/api/index.ts +1 -0
- package/src/chain/BlindEscrowClient.ts +182 -0
- package/src/chain/BlindReputationClient.ts +55 -0
- package/src/chain/ChainClient.ts +59 -0
- package/src/chain/TaskRegistryClient.ts +82 -0
- package/src/chain/abi/BlindEscrow.json +1113 -0
- package/src/chain/abi/BlindReputation.json +447 -0
- package/src/chain/abi/TaskRegistry.json +586 -0
- package/src/chain/abi/index.ts +5 -0
- package/src/chain/errors.ts +43 -0
- package/src/chain/index.ts +6 -0
- package/src/compute/index.ts +1 -0
- package/src/crypto/aes.ts +104 -0
- package/src/crypto/constants.ts +7 -0
- package/src/crypto/ecies.ts +60 -0
- package/src/crypto/envelope.ts +131 -0
- package/src/crypto/hkdf.ts +45 -0
- package/src/crypto/index.ts +6 -0
- package/src/crypto/keys.ts +56 -0
- package/src/errors/BlindMarketError.ts +38 -0
- package/src/errors/codes.ts +67 -0
- package/src/errors/index.ts +3 -0
- package/src/errors/subclasses.ts +59 -0
- package/src/events/EventBus.ts +45 -0
- package/src/events/index.ts +2 -0
- package/src/events/types.ts +13 -0
- package/src/index.ts +222 -0
- package/src/keystore/InMemoryKeyStore.ts +146 -0
- package/src/keystore/KeyStore.ts +19 -0
- package/src/keystore/index.ts +2 -0
- package/src/network/index.ts +3 -0
- package/src/network/presets.ts +27 -0
- package/src/network/resolve.ts +19 -0
- package/src/network/types.ts +18 -0
- package/src/signer/EthersSigner.ts +82 -0
- package/src/signer/PrivateKeySigner.ts +19 -0
- package/src/signer/Signer.ts +40 -0
- package/src/signer/index.ts +3 -0
- package/src/storage/MemoryStorage.ts +49 -0
- package/src/storage/Storage.ts +15 -0
- package/src/storage/ZgStorage.ts +124 -0
- package/src/storage/index.ts +3 -0
- package/src/testing/index.ts +1 -0
- package/src/types.ts +76 -0
- package/src/verifier/index.ts +1 -0
- package/src/worker/Worker.ts +98 -0
- package/src/worker/index.ts +1 -0
- package/test/agent.test.ts +193 -0
- package/test/chain.test.ts +145 -0
- package/test/crypto.aes.test.ts +81 -0
- package/test/crypto.compat.test.ts +33 -0
- package/test/crypto.ecies.test.ts +64 -0
- package/test/envelope.test.ts +82 -0
- package/test/errors.test.ts +64 -0
- package/test/events.test.ts +59 -0
- package/test/fixtures/crypto.json +16 -0
- package/test/keystore.test.ts +103 -0
- package/test/network.test.ts +53 -0
- package/test/signer.test.ts +66 -0
- package/test/smoke.test.ts +7 -0
- package/test/storage.test.ts +55 -0
- package/test/worker.test.ts +181 -0
- package/tsconfig.build.json +1 -0
- package/tsconfig.json +13 -0
- package/tsup.config.ts +32 -0
- package/vitest.config.ts +17 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/crypto/constants.ts","../../src/errors/codes.ts","../../src/errors/BlindBountyError.ts","../../src/errors/subclasses.ts","../../src/errors/index.ts","../../src/crypto/aes.ts","../../src/crypto/hkdf.ts","../../src/crypto/keys.ts","../../src/crypto/ecies.ts","../../src/crypto/envelope.ts","../../src/worker/Worker.ts"],"names":["toArrayBuffer","ethers"],"mappings":"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","file":"index.cjs","sourcesContent":["export const IV_LENGTH = 12;\nexport const TAG_LENGTH = 16;\nexport const KEY_LENGTH = 32;\nexport const ECIES_PUBKEY_LENGTH = 65;\nexport const ECIES_HKDF_INFO = new TextEncoder().encode('BlindBounty-ECIES-v1');\nexport const AES_MIN_BLOB = IV_LENGTH + TAG_LENGTH;\nexport const ECIES_MIN_BLOB = ECIES_PUBKEY_LENGTH + AES_MIN_BLOB;\n","export const ErrorCodes = {\n Config: ['CONFIG/INVALID_NETWORK', 'CONFIG/MISSING_SIGNER', 'CONFIG/BAD_CONFIG'] as const,\n Crypto: [\n 'CRYPTO/INVALID_KEY',\n 'CRYPTO/DECRYPT_FAILED',\n 'CRYPTO/INTEGRITY_CHECK',\n 'CRYPTO/UNSUPPORTED_CIPHER',\n ] as const,\n Storage: [\n 'STORAGE/UPLOAD_FAILED',\n 'STORAGE/DOWNLOAD_FAILED',\n 'STORAGE/MERKLE_MISMATCH',\n 'STORAGE/NOT_FOUND',\n 'STORAGE/INDEXER_UNREACHABLE',\n ] as const,\n Chain: [\n 'CHAIN/TX_REVERTED',\n 'CHAIN/TX_TIMED_OUT',\n 'CHAIN/NONCE_CONFLICT',\n 'CHAIN/INSUFFICIENT_BALANCE',\n 'CHAIN/NETWORK_MISMATCH',\n 'CHAIN/CONTRACT_NOT_DEPLOYED',\n ] as const,\n Compute: [\n 'COMPUTE/BROKER_UNREACHABLE',\n 'COMPUTE/NO_PROVIDERS',\n 'COMPUTE/LEDGER_INSUFFICIENT',\n 'COMPUTE/TEE_ATTESTATION_INVALID',\n 'COMPUTE/VERIFICATION_TIMEOUT',\n ] as const,\n Api: [\n 'API/AUTH_REQUIRED',\n 'API/AUTH_EXPIRED',\n 'API/FORBIDDEN',\n 'API/RATE_LIMITED',\n 'API/VALIDATION',\n 'API/SERVER',\n 'API/NOT_FOUND',\n ] as const,\n Lifecycle: [\n 'LIFECYCLE/ILLEGAL_TRANSITION',\n 'LIFECYCLE/TASK_NOT_FOUND',\n 'LIFECYCLE/NOT_ASSIGNED',\n 'LIFECYCLE/ALREADY_SUBMITTED',\n 'LIFECYCLE/CLAIM_NOT_READY',\n ] as const,\n Timeout: ['TIMEOUT'] as const,\n} as const;\n\nexport type ConfigCode = (typeof ErrorCodes.Config)[number];\nexport type CryptoCode = (typeof ErrorCodes.Crypto)[number];\nexport type StorageCode = (typeof ErrorCodes.Storage)[number];\nexport type ChainCode = (typeof ErrorCodes.Chain)[number];\nexport type ComputeCode = (typeof ErrorCodes.Compute)[number];\nexport type ApiCode = (typeof ErrorCodes.Api)[number];\nexport type LifecycleCode = (typeof ErrorCodes.Lifecycle)[number];\nexport type TimeoutCode = (typeof ErrorCodes.Timeout)[number];\n\nexport type ErrorCode =\n | ConfigCode\n | CryptoCode\n | StorageCode\n | ChainCode\n | ComputeCode\n | ApiCode\n | LifecycleCode\n | TimeoutCode;\n","import type { ErrorCode } from './codes.js';\n\nexport interface ErrorOptions {\n retriable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n}\n\nexport abstract class BlindBountyError extends Error {\n readonly code: ErrorCode;\n readonly retriable: boolean;\n readonly context?: Record<string, unknown>;\n override readonly cause?: unknown;\n\n constructor(code: ErrorCode, message: string, opts: ErrorOptions = {}) {\n super(message);\n this.code = code;\n this.retriable = opts.retriable ?? false;\n if (opts.context !== undefined) this.context = opts.context;\n if (opts.cause !== undefined) this.cause = opts.cause;\n Object.defineProperty(this, 'name', {\n value: this.constructor.name,\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n retriable: this.retriable,\n ...(this.context ? { context: this.context } : {}),\n };\n }\n}\n","import { BlindBountyError, type ErrorOptions } from './BlindBountyError.js';\nimport type {\n ApiCode,\n ChainCode,\n ComputeCode,\n ConfigCode,\n CryptoCode,\n LifecycleCode,\n StorageCode,\n TimeoutCode,\n} from './codes.js';\n\nexport class ConfigError extends BlindBountyError {\n constructor(code: ConfigCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class CryptoError extends BlindBountyError {\n constructor(code: CryptoCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class StorageError extends BlindBountyError {\n constructor(code: StorageCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ChainError extends BlindBountyError {\n constructor(code: ChainCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ComputeError extends BlindBountyError {\n constructor(code: ComputeCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ApiError extends BlindBountyError {\n constructor(code: ApiCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class LifecycleError extends BlindBountyError {\n constructor(code: LifecycleCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class TimeoutError extends BlindBountyError {\n constructor(code: TimeoutCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n","export * from './codes.js';\nexport * from './BlindBountyError.js';\nexport * from './subclasses.js';\n","import { CryptoError } from '../errors/index.js';\nimport { AES_MIN_BLOB, IV_LENGTH, KEY_LENGTH, TAG_LENGTH } from './constants.js';\n\nfunction getCrypto(): Crypto {\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (!c?.subtle) {\n throw new CryptoError('CRYPTO/UNSUPPORTED_CIPHER', 'Web Crypto (crypto.subtle) is not available');\n }\n return c;\n}\n\nfunction toArrayBuffer(u: Uint8Array): ArrayBuffer {\n const ab = new ArrayBuffer(u.byteLength);\n new Uint8Array(ab).set(u);\n return ab;\n}\n\n/** Generate a fresh 32-byte AES-256 key. */\nexport async function generateAesKey(): Promise<Uint8Array> {\n const key = new Uint8Array(KEY_LENGTH);\n getCrypto().getRandomValues(key);\n return key;\n}\n\n/**\n * AES-256-GCM encrypt. Output format: [12 IV][16 tag][ciphertext].\n * This ordering matches backend/src/services/crypto.ts and frontend/src/lib/crypto.ts\n * byte-for-byte, so SDK blobs decrypt anywhere in the stack.\n */\nexport async function aesEncrypt(plaintext: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n if (key.byteLength !== KEY_LENGTH) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n `AES key must be ${KEY_LENGTH} bytes, got ${key.byteLength}`,\n );\n }\n const c = getCrypto();\n const iv = new Uint8Array(IV_LENGTH);\n c.getRandomValues(iv);\n try {\n const ck = await c.subtle.importKey('raw', toArrayBuffer(key), 'AES-GCM', false, ['encrypt']);\n const wcOut = new Uint8Array(\n await c.subtle.encrypt(\n { name: 'AES-GCM', iv: toArrayBuffer(iv), tagLength: TAG_LENGTH * 8 },\n ck,\n toArrayBuffer(plaintext),\n ),\n );\n // WebCrypto returns [ciphertext || tag]. Rewrite to [IV || tag || ciphertext].\n const ctLen = wcOut.length - TAG_LENGTH;\n const ct = wcOut.subarray(0, ctLen);\n const tag = wcOut.subarray(ctLen);\n const blob = new Uint8Array(IV_LENGTH + TAG_LENGTH + ctLen);\n blob.set(iv, 0);\n blob.set(tag, IV_LENGTH);\n blob.set(ct, IV_LENGTH + TAG_LENGTH);\n return blob;\n } catch (cause) {\n throw new CryptoError('CRYPTO/DECRYPT_FAILED', 'AES-GCM encryption failed', { cause });\n }\n}\n\n/**\n * AES-256-GCM decrypt. Input format: [12 IV][16 tag][ciphertext].\n * Throws CRYPTO/INTEGRITY_CHECK on truncation or tag mismatch.\n */\nexport async function aesDecrypt(blob: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n if (key.byteLength !== KEY_LENGTH) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n `AES key must be ${KEY_LENGTH} bytes, got ${key.byteLength}`,\n );\n }\n if (blob.byteLength < AES_MIN_BLOB) {\n throw new CryptoError(\n 'CRYPTO/INTEGRITY_CHECK',\n `AES blob too short: need ≥${AES_MIN_BLOB} bytes, got ${blob.byteLength}`,\n );\n }\n const iv = blob.subarray(0, IV_LENGTH);\n const tag = blob.subarray(IV_LENGTH, IV_LENGTH + TAG_LENGTH);\n const ct = blob.subarray(IV_LENGTH + TAG_LENGTH);\n const combined = new Uint8Array(ct.length + TAG_LENGTH);\n combined.set(ct, 0);\n combined.set(tag, ct.length);\n try {\n const c = getCrypto();\n const ck = await c.subtle.importKey('raw', toArrayBuffer(key), 'AES-GCM', false, ['decrypt']);\n const pt = await c.subtle.decrypt(\n { name: 'AES-GCM', iv: toArrayBuffer(iv), tagLength: TAG_LENGTH * 8 },\n ck,\n toArrayBuffer(combined),\n );\n return new Uint8Array(pt);\n } catch (cause) {\n throw new CryptoError('CRYPTO/DECRYPT_FAILED', 'AES-GCM decryption failed (wrong key or tampered data)', { cause });\n }\n}\n\n/** SHA-256 of arbitrary bytes. Returns 32-byte digest. */\nexport async function sha256(data: Uint8Array): Promise<Uint8Array> {\n const digest = await getCrypto().subtle.digest('SHA-256', toArrayBuffer(data));\n return new Uint8Array(digest);\n}\n","import { CryptoError } from '../errors/index.js';\nimport { ECIES_HKDF_INFO } from './constants.js';\n\nfunction getSubtle(): SubtleCrypto {\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (!c?.subtle) {\n throw new CryptoError('CRYPTO/UNSUPPORTED_CIPHER', 'Web Crypto (crypto.subtle) is not available');\n }\n return c.subtle;\n}\n\nfunction toArrayBuffer(u: Uint8Array): ArrayBuffer {\n const ab = new ArrayBuffer(u.byteLength);\n new Uint8Array(ab).set(u);\n return ab;\n}\n\n/**\n * HKDF-SHA256. Defaults match backend: empty salt, the ECIES domain separation info,\n * 32-byte output length. Pass custom values for other uses.\n */\nexport async function hkdfSha256(\n ikm: Uint8Array,\n length = 32,\n info: Uint8Array = ECIES_HKDF_INFO,\n salt: Uint8Array = new Uint8Array(0),\n): Promise<Uint8Array> {\n try {\n const subtle = getSubtle();\n const baseKey = await subtle.importKey('raw', toArrayBuffer(ikm), 'HKDF', false, ['deriveBits']);\n const derived = await subtle.deriveBits(\n {\n name: 'HKDF',\n hash: 'SHA-256',\n info: toArrayBuffer(info),\n salt: toArrayBuffer(salt),\n },\n baseKey,\n length * 8,\n );\n return new Uint8Array(derived);\n } catch (cause) {\n throw new CryptoError('CRYPTO/INVALID_KEY', 'HKDF derivation failed', { cause });\n }\n}\n","import { ethers } from 'ethers';\nimport { CryptoError } from '../errors/index.js';\n\nexport interface KeyPair {\n privateKey: string;\n publicKey: string;\n}\n\n/** Fresh secp256k1 keypair. Hex strings returned un-prefixed (no 0x). */\nexport function generateKeyPair(): KeyPair {\n const w = ethers.Wallet.createRandom();\n return {\n privateKey: w.privateKey.slice(2),\n publicKey: w.signingKey.publicKey.slice(2),\n };\n}\n\n/** Recover the uncompressed public key (un-prefixed hex) from a private key. */\nexport function derivePublicKey(privateKey: string): string {\n const sk = new ethers.SigningKey(`0x${strip(privateKey)}`);\n return sk.publicKey.slice(2);\n}\n\nexport function strip(hex: string): string {\n return hex.startsWith('0x') || hex.startsWith('0X') ? hex.slice(2) : hex;\n}\n\nexport function assertUncompressedPubKey(pub: string): void {\n const s = strip(pub);\n if (s.length !== 130 || !/^04/i.test(s)) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n 'expected uncompressed secp256k1 pubkey (65 bytes hex, starts with 04)',\n );\n }\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n const s = strip(hex);\n if (s.length % 2 !== 0) {\n throw new CryptoError('CRYPTO/INVALID_KEY', 'hex string has odd length');\n }\n const out = new Uint8Array(s.length / 2);\n for (let i = 0; i < out.length; i++) {\n const byte = Number.parseInt(s.substring(i * 2, i * 2 + 2), 16);\n if (Number.isNaN(byte)) {\n throw new CryptoError('CRYPTO/INVALID_KEY', `invalid hex byte at position ${i * 2}`);\n }\n out[i] = byte;\n }\n return out;\n}\n\nexport function bytesToHex(u: Uint8Array): string {\n return Array.from(u, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n","import { ethers } from 'ethers';\nimport { CryptoError } from '../errors/index.js';\nimport { aesDecrypt, aesEncrypt } from './aes.js';\nimport { ECIES_MIN_BLOB, ECIES_PUBKEY_LENGTH, KEY_LENGTH } from './constants.js';\nimport { hkdfSha256 } from './hkdf.js';\nimport { assertUncompressedPubKey, bytesToHex, hexToBytes, strip } from './keys.js';\n\n/**\n * ECIES-secp256k1 encrypt to a recipient's uncompressed public key.\n * Wire format: [65 ephemeral pubkey][12 IV][16 tag][ciphertext].\n * Byte-compatible with backend/src/services/crypto.ts.\n */\nexport async function eciesEncrypt(plaintext: Uint8Array, recipientPubKey: string): Promise<Uint8Array> {\n assertUncompressedPubKey(recipientPubKey);\n const ephemeral = ethers.Wallet.createRandom();\n const shared = deriveSharedSecretX(ephemeral.privateKey, `0x${strip(recipientPubKey)}`);\n const aesKey = await hkdfSha256(shared, KEY_LENGTH);\n const aesBlob = await aesEncrypt(plaintext, aesKey);\n const ephPub = hexToBytes(strip(ephemeral.signingKey.publicKey));\n if (ephPub.byteLength !== ECIES_PUBKEY_LENGTH) {\n throw new CryptoError('CRYPTO/INVALID_KEY', `ephemeral pubkey length ${ephPub.byteLength}`);\n }\n const blob = new Uint8Array(ECIES_PUBKEY_LENGTH + aesBlob.byteLength);\n blob.set(ephPub, 0);\n blob.set(aesBlob, ECIES_PUBKEY_LENGTH);\n return blob;\n}\n\n/** ECIES-secp256k1 decrypt with the recipient's private key. */\nexport async function eciesDecrypt(blob: Uint8Array, recipientPrivKey: string): Promise<Uint8Array> {\n if (blob.byteLength < ECIES_MIN_BLOB) {\n throw new CryptoError(\n 'CRYPTO/INTEGRITY_CHECK',\n `ECIES blob too short: need ≥${ECIES_MIN_BLOB} bytes, got ${blob.byteLength}`,\n );\n }\n const ephPub = blob.subarray(0, ECIES_PUBKEY_LENGTH);\n const aesBlob = blob.subarray(ECIES_PUBKEY_LENGTH);\n const shared = deriveSharedSecretX(`0x${strip(recipientPrivKey)}`, `0x${bytesToHex(ephPub)}`);\n const aesKey = await hkdfSha256(shared, KEY_LENGTH);\n return aesDecrypt(aesBlob, aesKey);\n}\n\n/**\n * Compute the ECDH shared secret X coordinate (32 bytes) between a private key\n * and a peer's public key. Matches Node createECDH.computeSecret() output used by\n * the backend — ethers v6 returns 0x04||X||Y, so we slice X.\n */\nfunction deriveSharedSecretX(privHex: string, pubHex: string): Uint8Array {\n const sk = new ethers.SigningKey(privHex);\n const shared = sk.computeSharedSecret(pubHex);\n const bytes = hexToBytes(strip(shared));\n if (bytes.byteLength !== 65 || bytes[0] !== 0x04) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n `unexpected shared secret shape (len=${bytes.byteLength}, prefix=${bytes[0]?.toString(16) ?? 'none'})`,\n );\n }\n return bytes.subarray(1, 33);\n}\n","import { CryptoError } from '../errors/index.js';\nimport { aesDecrypt, aesEncrypt, generateAesKey } from './aes.js';\nimport { eciesEncrypt } from './ecies.js';\n\n/**\n * Evidence envelope — the single blob a worker uploads to Storage containing:\n * 1. The AES key wrapped to the agent's pubkey (so agent can decrypt later)\n * 2. The AES key wrapped to the TEE enclave's pubkey (so Sealed Inference can decrypt)\n * 3. The evidence ciphertext under that AES key\n *\n * Wire format (big-endian):\n * bytes 0..1 magic = 0x42 0x42 (\"BB\")\n * byte 2 version = 0x01\n * bytes 3..6 wrappedAgentLen (uint32)\n * bytes 7.. wrappedAgent (ECIES blob)\n * 4-byte uint32 wrappedEnclaveLen\n * bytes wrappedEnclave (ECIES blob)\n * bytes aesCiphertext (rest of the blob — AES blob [IV||tag||ct])\n *\n * The layout is versioned so we can rev it without breaking old blobs.\n */\n\nconst MAGIC_0 = 0x42;\nconst MAGIC_1 = 0x42;\nconst VERSION = 0x01;\nconst HEADER_LEN = 3;\n\nexport interface EvidenceEnvelope {\n wrappedForAgent: Uint8Array;\n wrappedForEnclave: Uint8Array;\n aesCiphertext: Uint8Array;\n}\n\nexport interface SealEvidenceInput {\n evidence: Uint8Array;\n agentPubKey: string;\n enclavePubKey: string;\n}\n\nexport interface SealEvidenceOutput {\n envelope: Uint8Array;\n aesKey: Uint8Array;\n}\n\n/**\n * Seal evidence for the agent + TEE enclave. Generates a fresh AES key,\n * encrypts the evidence, ECIES-wraps the key twice, and concatenates the\n * result as an EvidenceEnvelope. Returns both the on-wire envelope and\n * the raw AES key (for audit / diagnostic use — do NOT persist beyond\n * the submission).\n */\nexport async function sealEvidence(input: SealEvidenceInput): Promise<SealEvidenceOutput> {\n const aesKey = await generateAesKey();\n const aesCiphertext = await aesEncrypt(input.evidence, aesKey);\n const wrappedForAgent = await eciesEncrypt(aesKey, input.agentPubKey);\n const wrappedForEnclave = await eciesEncrypt(aesKey, input.enclavePubKey);\n const envelope = pack({ wrappedForAgent, wrappedForEnclave, aesCiphertext });\n return { envelope, aesKey };\n}\n\n/**\n * Open an evidence envelope as the agent — extracts the AES key wrapped\n * to the agent's pubkey, decrypts the ciphertext, and returns the plaintext\n * evidence. The enclave-wrapped key is ignored by agents (TEE-only).\n */\nexport async function openEvidenceAsAgent(\n envelope: Uint8Array,\n agentPrivKey: string,\n): Promise<Uint8Array> {\n const parsed = parse(envelope);\n const { eciesDecrypt } = await import('./ecies.js');\n const aesKey = await eciesDecrypt(parsed.wrappedForAgent, agentPrivKey);\n return aesDecrypt(parsed.aesCiphertext, aesKey);\n}\n\nfunction pack(parts: EvidenceEnvelope): Uint8Array {\n const { wrappedForAgent, wrappedForEnclave, aesCiphertext } = parts;\n const total =\n HEADER_LEN +\n 4 + wrappedForAgent.byteLength +\n 4 + wrappedForEnclave.byteLength +\n aesCiphertext.byteLength;\n const out = new Uint8Array(total);\n const view = new DataView(out.buffer);\n let off = 0;\n out[off++] = MAGIC_0;\n out[off++] = MAGIC_1;\n out[off++] = VERSION;\n view.setUint32(off, wrappedForAgent.byteLength, false);\n off += 4;\n out.set(wrappedForAgent, off);\n off += wrappedForAgent.byteLength;\n view.setUint32(off, wrappedForEnclave.byteLength, false);\n off += 4;\n out.set(wrappedForEnclave, off);\n off += wrappedForEnclave.byteLength;\n out.set(aesCiphertext, off);\n return out;\n}\n\nfunction parse(blob: Uint8Array): EvidenceEnvelope {\n if (blob.byteLength < HEADER_LEN + 4 + 4) {\n throw new CryptoError('CRYPTO/INTEGRITY_CHECK', `envelope too short: ${blob.byteLength}`);\n }\n if (blob[0] !== MAGIC_0 || blob[1] !== MAGIC_1) {\n throw new CryptoError('CRYPTO/INTEGRITY_CHECK', 'bad envelope magic');\n }\n if (blob[2] !== VERSION) {\n throw new CryptoError('CRYPTO/UNSUPPORTED_CIPHER', `unknown envelope version ${blob[2]}`);\n }\n const view = new DataView(blob.buffer, blob.byteOffset, blob.byteLength);\n let off = HEADER_LEN;\n const agentLen = view.getUint32(off, false);\n off += 4;\n if (off + agentLen + 4 > blob.byteLength) {\n throw new CryptoError('CRYPTO/INTEGRITY_CHECK', 'envelope truncated (agent)');\n }\n const wrappedForAgent = blob.slice(off, off + agentLen);\n off += agentLen;\n const enclaveLen = view.getUint32(off, false);\n off += 4;\n if (off + enclaveLen > blob.byteLength) {\n throw new CryptoError('CRYPTO/INTEGRITY_CHECK', 'envelope truncated (enclave)');\n }\n const wrappedForEnclave = blob.slice(off, off + enclaveLen);\n off += enclaveLen;\n const aesCiphertext = blob.slice(off);\n return { wrappedForAgent, wrappedForEnclave, aesCiphertext };\n}\n\nexport const __internals = { pack, parse };\n","import type { BlindEscrowClient, OnChainTask, TaskRegistryClient } from '../chain/index.js';\nimport { aesDecrypt, eciesDecrypt, sealEvidence } from '../crypto/index.js';\nimport type { EventBus, SdkEvents } from '../events/index.js';\nimport type { Signer } from '../signer/index.js';\nimport type { Storage } from '../storage/index.js';\nimport type { Hex, RootHash, TaskId, TxReceiptLike } from '../types.js';\n\nexport interface WorkerDeps {\n escrow: BlindEscrowClient;\n registry: TaskRegistryClient;\n storage: Storage;\n signer: Signer;\n events?: EventBus<SdkEvents>;\n}\n\nexport interface DecryptInstructionsInput {\n /** ECIES-wrapped AES key delivered out-of-band by the agent (e.g. via the backend API). */\n wrappedKey: Uint8Array;\n /** Worker's private key, hex with or without 0x prefix. */\n workerPrivKey: string;\n /** Storage root hash from the on-chain task metadata. */\n taskHash: RootHash;\n}\n\nexport interface SubmitEvidenceInput {\n taskId: TaskId;\n evidence: string | Uint8Array;\n /** Agent's uncompressed secp256k1 pubkey (retrieved via the backend or chain). */\n agentPubKey: string;\n /** TEE enclave pubkey for Sealed Inference (from 0G Compute broker). */\n enclavePubKey: string;\n}\n\nexport interface SubmitEvidenceResult {\n rootHash: RootHash;\n txHash: Hex;\n receipt: TxReceiptLike;\n}\n\n/**\n * Worker-side flows: browse open tasks, decrypt assigned instructions, seal\n * evidence for agent + TEE, and claim payment after the deadline if\n * verification stalls. Peer pubkeys and wrapped keys are passed explicitly;\n * the SDK does not assume a specific message-passing substrate.\n */\nexport class Worker {\n constructor(private readonly deps: WorkerDeps) {}\n\n async browse(offset: bigint, limit: bigint): Promise<TaskId[]> {\n return this.deps.registry.getOpenTasks(offset, limit);\n }\n\n async getTaskDetail(taskId: TaskId): Promise<OnChainTask> {\n return this.deps.escrow.getTask(taskId);\n }\n\n async decryptInstructions(input: DecryptInstructionsInput): Promise<Uint8Array> {\n const aesKey = await eciesDecrypt(input.wrappedKey, input.workerPrivKey);\n const ciphertext = await this.deps.storage.download(input.taskHash);\n return aesDecrypt(ciphertext, aesKey);\n }\n\n async submitEvidence(input: SubmitEvidenceInput): Promise<SubmitEvidenceResult> {\n const evidenceBytes = typeof input.evidence === 'string'\n ? new TextEncoder().encode(input.evidence)\n : input.evidence;\n\n const { envelope } = await sealEvidence({\n evidence: evidenceBytes,\n agentPubKey: input.agentPubKey,\n enclavePubKey: input.enclavePubKey,\n });\n\n const uploaded = await this.deps.storage.upload(envelope);\n const rootHash = uploaded.rootHash;\n\n const receipt = await this.deps.escrow.submitEvidence(input.taskId, rootHash);\n\n this.deps.events?.emit('evidence.submitted', {\n taskId: input.taskId,\n rootHash,\n txHash: receipt.hash,\n });\n\n return { rootHash, txHash: receipt.hash, receipt };\n }\n\n /**\n * Worker escape hatch: reclaim escrow after the deadline if completeVerification\n * was never called. Payment released per contract logic (85% worker, 15% treasury\n * or full refund depending on submission state — see BlindEscrow.claimTimeout).\n */\n async claimTimeout(taskId: TaskId): Promise<TxReceiptLike> {\n const receipt = await this.deps.escrow.claimTimeout(taskId);\n this.deps.events?.emit('payment.claimed', { taskId, txHash: receipt.hash, amount: 0n });\n return receipt;\n }\n}\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { B as BlindEscrowClient, O as OnChainTask } from '../BlindEscrowClient-CyPuKMge.cjs';
|
|
2
|
+
import { T as TaskRegistryClient } from '../TaskRegistryClient-CrQjddDc.cjs';
|
|
3
|
+
import { d as RootHash, T as TaskId, H as Hex, b as TxReceiptLike } from '../types-BOG5Ub1z.cjs';
|
|
4
|
+
import { S as Signer } from '../Signer-BnqH_qew.cjs';
|
|
5
|
+
import { EventBus, SdkEvents } from '../events/index.cjs';
|
|
6
|
+
import { S as Storage } from '../Storage-Cf4IJRMk.cjs';
|
|
7
|
+
import 'ethers';
|
|
8
|
+
|
|
9
|
+
interface WorkerDeps {
|
|
10
|
+
escrow: BlindEscrowClient;
|
|
11
|
+
registry: TaskRegistryClient;
|
|
12
|
+
storage: Storage;
|
|
13
|
+
signer: Signer;
|
|
14
|
+
events?: EventBus<SdkEvents>;
|
|
15
|
+
}
|
|
16
|
+
interface DecryptInstructionsInput {
|
|
17
|
+
/** ECIES-wrapped AES key delivered out-of-band by the agent (e.g. via the backend API). */
|
|
18
|
+
wrappedKey: Uint8Array;
|
|
19
|
+
/** Worker's private key, hex with or without 0x prefix. */
|
|
20
|
+
workerPrivKey: string;
|
|
21
|
+
/** Storage root hash from the on-chain task metadata. */
|
|
22
|
+
taskHash: RootHash;
|
|
23
|
+
}
|
|
24
|
+
interface SubmitEvidenceInput {
|
|
25
|
+
taskId: TaskId;
|
|
26
|
+
evidence: string | Uint8Array;
|
|
27
|
+
/** Agent's uncompressed secp256k1 pubkey (retrieved via the backend or chain). */
|
|
28
|
+
agentPubKey: string;
|
|
29
|
+
/** TEE enclave pubkey for Sealed Inference (from 0G Compute broker). */
|
|
30
|
+
enclavePubKey: string;
|
|
31
|
+
}
|
|
32
|
+
interface SubmitEvidenceResult {
|
|
33
|
+
rootHash: RootHash;
|
|
34
|
+
txHash: Hex;
|
|
35
|
+
receipt: TxReceiptLike;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Worker-side flows: browse open tasks, decrypt assigned instructions, seal
|
|
39
|
+
* evidence for agent + TEE, and claim payment after the deadline if
|
|
40
|
+
* verification stalls. Peer pubkeys and wrapped keys are passed explicitly;
|
|
41
|
+
* the SDK does not assume a specific message-passing substrate.
|
|
42
|
+
*/
|
|
43
|
+
declare class Worker {
|
|
44
|
+
private readonly deps;
|
|
45
|
+
constructor(deps: WorkerDeps);
|
|
46
|
+
browse(offset: bigint, limit: bigint): Promise<TaskId[]>;
|
|
47
|
+
getTaskDetail(taskId: TaskId): Promise<OnChainTask>;
|
|
48
|
+
decryptInstructions(input: DecryptInstructionsInput): Promise<Uint8Array>;
|
|
49
|
+
submitEvidence(input: SubmitEvidenceInput): Promise<SubmitEvidenceResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Worker escape hatch: reclaim escrow after the deadline if completeVerification
|
|
52
|
+
* was never called. Payment released per contract logic (85% worker, 15% treasury
|
|
53
|
+
* or full refund depending on submission state — see BlindEscrow.claimTimeout).
|
|
54
|
+
*/
|
|
55
|
+
claimTimeout(taskId: TaskId): Promise<TxReceiptLike>;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export { type DecryptInstructionsInput, type SubmitEvidenceInput, type SubmitEvidenceResult, Worker, type WorkerDeps };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Worker.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Worker.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/crypto/constants.ts","../../src/errors/codes.ts","../../src/errors/BlindBountyError.ts","../../src/errors/subclasses.ts","../../src/errors/index.ts","../../src/crypto/aes.ts","../../src/crypto/hkdf.ts","../../src/crypto/keys.ts","../../src/crypto/ecies.ts","../../src/crypto/envelope.ts","../../src/worker/Worker.ts"],"names":["toArrayBuffer","ethers"],"mappings":"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","file":"index.js","sourcesContent":["export const IV_LENGTH = 12;\nexport const TAG_LENGTH = 16;\nexport const KEY_LENGTH = 32;\nexport const ECIES_PUBKEY_LENGTH = 65;\nexport const ECIES_HKDF_INFO = new TextEncoder().encode('BlindBounty-ECIES-v1');\nexport const AES_MIN_BLOB = IV_LENGTH + TAG_LENGTH;\nexport const ECIES_MIN_BLOB = ECIES_PUBKEY_LENGTH + AES_MIN_BLOB;\n","export const ErrorCodes = {\n Config: ['CONFIG/INVALID_NETWORK', 'CONFIG/MISSING_SIGNER', 'CONFIG/BAD_CONFIG'] as const,\n Crypto: [\n 'CRYPTO/INVALID_KEY',\n 'CRYPTO/DECRYPT_FAILED',\n 'CRYPTO/INTEGRITY_CHECK',\n 'CRYPTO/UNSUPPORTED_CIPHER',\n ] as const,\n Storage: [\n 'STORAGE/UPLOAD_FAILED',\n 'STORAGE/DOWNLOAD_FAILED',\n 'STORAGE/MERKLE_MISMATCH',\n 'STORAGE/NOT_FOUND',\n 'STORAGE/INDEXER_UNREACHABLE',\n ] as const,\n Chain: [\n 'CHAIN/TX_REVERTED',\n 'CHAIN/TX_TIMED_OUT',\n 'CHAIN/NONCE_CONFLICT',\n 'CHAIN/INSUFFICIENT_BALANCE',\n 'CHAIN/NETWORK_MISMATCH',\n 'CHAIN/CONTRACT_NOT_DEPLOYED',\n ] as const,\n Compute: [\n 'COMPUTE/BROKER_UNREACHABLE',\n 'COMPUTE/NO_PROVIDERS',\n 'COMPUTE/LEDGER_INSUFFICIENT',\n 'COMPUTE/TEE_ATTESTATION_INVALID',\n 'COMPUTE/VERIFICATION_TIMEOUT',\n ] as const,\n Api: [\n 'API/AUTH_REQUIRED',\n 'API/AUTH_EXPIRED',\n 'API/FORBIDDEN',\n 'API/RATE_LIMITED',\n 'API/VALIDATION',\n 'API/SERVER',\n 'API/NOT_FOUND',\n ] as const,\n Lifecycle: [\n 'LIFECYCLE/ILLEGAL_TRANSITION',\n 'LIFECYCLE/TASK_NOT_FOUND',\n 'LIFECYCLE/NOT_ASSIGNED',\n 'LIFECYCLE/ALREADY_SUBMITTED',\n 'LIFECYCLE/CLAIM_NOT_READY',\n ] as const,\n Timeout: ['TIMEOUT'] as const,\n} as const;\n\nexport type ConfigCode = (typeof ErrorCodes.Config)[number];\nexport type CryptoCode = (typeof ErrorCodes.Crypto)[number];\nexport type StorageCode = (typeof ErrorCodes.Storage)[number];\nexport type ChainCode = (typeof ErrorCodes.Chain)[number];\nexport type ComputeCode = (typeof ErrorCodes.Compute)[number];\nexport type ApiCode = (typeof ErrorCodes.Api)[number];\nexport type LifecycleCode = (typeof ErrorCodes.Lifecycle)[number];\nexport type TimeoutCode = (typeof ErrorCodes.Timeout)[number];\n\nexport type ErrorCode =\n | ConfigCode\n | CryptoCode\n | StorageCode\n | ChainCode\n | ComputeCode\n | ApiCode\n | LifecycleCode\n | TimeoutCode;\n","import type { ErrorCode } from './codes.js';\n\nexport interface ErrorOptions {\n retriable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n}\n\nexport abstract class BlindBountyError extends Error {\n readonly code: ErrorCode;\n readonly retriable: boolean;\n readonly context?: Record<string, unknown>;\n override readonly cause?: unknown;\n\n constructor(code: ErrorCode, message: string, opts: ErrorOptions = {}) {\n super(message);\n this.code = code;\n this.retriable = opts.retriable ?? false;\n if (opts.context !== undefined) this.context = opts.context;\n if (opts.cause !== undefined) this.cause = opts.cause;\n Object.defineProperty(this, 'name', {\n value: this.constructor.name,\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n retriable: this.retriable,\n ...(this.context ? { context: this.context } : {}),\n };\n }\n}\n","import { BlindBountyError, type ErrorOptions } from './BlindBountyError.js';\nimport type {\n ApiCode,\n ChainCode,\n ComputeCode,\n ConfigCode,\n CryptoCode,\n LifecycleCode,\n StorageCode,\n TimeoutCode,\n} from './codes.js';\n\nexport class ConfigError extends BlindBountyError {\n constructor(code: ConfigCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class CryptoError extends BlindBountyError {\n constructor(code: CryptoCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class StorageError extends BlindBountyError {\n constructor(code: StorageCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ChainError extends BlindBountyError {\n constructor(code: ChainCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ComputeError extends BlindBountyError {\n constructor(code: ComputeCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class ApiError extends BlindBountyError {\n constructor(code: ApiCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class LifecycleError extends BlindBountyError {\n constructor(code: LifecycleCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n\nexport class TimeoutError extends BlindBountyError {\n constructor(code: TimeoutCode, msg: string, opts?: ErrorOptions) {\n super(code, msg, opts);\n }\n}\n","export * from './codes.js';\nexport * from './BlindBountyError.js';\nexport * from './subclasses.js';\n","import { CryptoError } from '../errors/index.js';\nimport { AES_MIN_BLOB, IV_LENGTH, KEY_LENGTH, TAG_LENGTH } from './constants.js';\n\nfunction getCrypto(): Crypto {\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (!c?.subtle) {\n throw new CryptoError('CRYPTO/UNSUPPORTED_CIPHER', 'Web Crypto (crypto.subtle) is not available');\n }\n return c;\n}\n\nfunction toArrayBuffer(u: Uint8Array): ArrayBuffer {\n const ab = new ArrayBuffer(u.byteLength);\n new Uint8Array(ab).set(u);\n return ab;\n}\n\n/** Generate a fresh 32-byte AES-256 key. */\nexport async function generateAesKey(): Promise<Uint8Array> {\n const key = new Uint8Array(KEY_LENGTH);\n getCrypto().getRandomValues(key);\n return key;\n}\n\n/**\n * AES-256-GCM encrypt. Output format: [12 IV][16 tag][ciphertext].\n * This ordering matches backend/src/services/crypto.ts and frontend/src/lib/crypto.ts\n * byte-for-byte, so SDK blobs decrypt anywhere in the stack.\n */\nexport async function aesEncrypt(plaintext: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n if (key.byteLength !== KEY_LENGTH) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n `AES key must be ${KEY_LENGTH} bytes, got ${key.byteLength}`,\n );\n }\n const c = getCrypto();\n const iv = new Uint8Array(IV_LENGTH);\n c.getRandomValues(iv);\n try {\n const ck = await c.subtle.importKey('raw', toArrayBuffer(key), 'AES-GCM', false, ['encrypt']);\n const wcOut = new Uint8Array(\n await c.subtle.encrypt(\n { name: 'AES-GCM', iv: toArrayBuffer(iv), tagLength: TAG_LENGTH * 8 },\n ck,\n toArrayBuffer(plaintext),\n ),\n );\n // WebCrypto returns [ciphertext || tag]. Rewrite to [IV || tag || ciphertext].\n const ctLen = wcOut.length - TAG_LENGTH;\n const ct = wcOut.subarray(0, ctLen);\n const tag = wcOut.subarray(ctLen);\n const blob = new Uint8Array(IV_LENGTH + TAG_LENGTH + ctLen);\n blob.set(iv, 0);\n blob.set(tag, IV_LENGTH);\n blob.set(ct, IV_LENGTH + TAG_LENGTH);\n return blob;\n } catch (cause) {\n throw new CryptoError('CRYPTO/DECRYPT_FAILED', 'AES-GCM encryption failed', { cause });\n }\n}\n\n/**\n * AES-256-GCM decrypt. Input format: [12 IV][16 tag][ciphertext].\n * Throws CRYPTO/INTEGRITY_CHECK on truncation or tag mismatch.\n */\nexport async function aesDecrypt(blob: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n if (key.byteLength !== KEY_LENGTH) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n `AES key must be ${KEY_LENGTH} bytes, got ${key.byteLength}`,\n );\n }\n if (blob.byteLength < AES_MIN_BLOB) {\n throw new CryptoError(\n 'CRYPTO/INTEGRITY_CHECK',\n `AES blob too short: need ≥${AES_MIN_BLOB} bytes, got ${blob.byteLength}`,\n );\n }\n const iv = blob.subarray(0, IV_LENGTH);\n const tag = blob.subarray(IV_LENGTH, IV_LENGTH + TAG_LENGTH);\n const ct = blob.subarray(IV_LENGTH + TAG_LENGTH);\n const combined = new Uint8Array(ct.length + TAG_LENGTH);\n combined.set(ct, 0);\n combined.set(tag, ct.length);\n try {\n const c = getCrypto();\n const ck = await c.subtle.importKey('raw', toArrayBuffer(key), 'AES-GCM', false, ['decrypt']);\n const pt = await c.subtle.decrypt(\n { name: 'AES-GCM', iv: toArrayBuffer(iv), tagLength: TAG_LENGTH * 8 },\n ck,\n toArrayBuffer(combined),\n );\n return new Uint8Array(pt);\n } catch (cause) {\n throw new CryptoError('CRYPTO/DECRYPT_FAILED', 'AES-GCM decryption failed (wrong key or tampered data)', { cause });\n }\n}\n\n/** SHA-256 of arbitrary bytes. Returns 32-byte digest. */\nexport async function sha256(data: Uint8Array): Promise<Uint8Array> {\n const digest = await getCrypto().subtle.digest('SHA-256', toArrayBuffer(data));\n return new Uint8Array(digest);\n}\n","import { CryptoError } from '../errors/index.js';\nimport { ECIES_HKDF_INFO } from './constants.js';\n\nfunction getSubtle(): SubtleCrypto {\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (!c?.subtle) {\n throw new CryptoError('CRYPTO/UNSUPPORTED_CIPHER', 'Web Crypto (crypto.subtle) is not available');\n }\n return c.subtle;\n}\n\nfunction toArrayBuffer(u: Uint8Array): ArrayBuffer {\n const ab = new ArrayBuffer(u.byteLength);\n new Uint8Array(ab).set(u);\n return ab;\n}\n\n/**\n * HKDF-SHA256. Defaults match backend: empty salt, the ECIES domain separation info,\n * 32-byte output length. Pass custom values for other uses.\n */\nexport async function hkdfSha256(\n ikm: Uint8Array,\n length = 32,\n info: Uint8Array = ECIES_HKDF_INFO,\n salt: Uint8Array = new Uint8Array(0),\n): Promise<Uint8Array> {\n try {\n const subtle = getSubtle();\n const baseKey = await subtle.importKey('raw', toArrayBuffer(ikm), 'HKDF', false, ['deriveBits']);\n const derived = await subtle.deriveBits(\n {\n name: 'HKDF',\n hash: 'SHA-256',\n info: toArrayBuffer(info),\n salt: toArrayBuffer(salt),\n },\n baseKey,\n length * 8,\n );\n return new Uint8Array(derived);\n } catch (cause) {\n throw new CryptoError('CRYPTO/INVALID_KEY', 'HKDF derivation failed', { cause });\n }\n}\n","import { ethers } from 'ethers';\nimport { CryptoError } from '../errors/index.js';\n\nexport interface KeyPair {\n privateKey: string;\n publicKey: string;\n}\n\n/** Fresh secp256k1 keypair. Hex strings returned un-prefixed (no 0x). */\nexport function generateKeyPair(): KeyPair {\n const w = ethers.Wallet.createRandom();\n return {\n privateKey: w.privateKey.slice(2),\n publicKey: w.signingKey.publicKey.slice(2),\n };\n}\n\n/** Recover the uncompressed public key (un-prefixed hex) from a private key. */\nexport function derivePublicKey(privateKey: string): string {\n const sk = new ethers.SigningKey(`0x${strip(privateKey)}`);\n return sk.publicKey.slice(2);\n}\n\nexport function strip(hex: string): string {\n return hex.startsWith('0x') || hex.startsWith('0X') ? hex.slice(2) : hex;\n}\n\nexport function assertUncompressedPubKey(pub: string): void {\n const s = strip(pub);\n if (s.length !== 130 || !/^04/i.test(s)) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n 'expected uncompressed secp256k1 pubkey (65 bytes hex, starts with 04)',\n );\n }\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n const s = strip(hex);\n if (s.length % 2 !== 0) {\n throw new CryptoError('CRYPTO/INVALID_KEY', 'hex string has odd length');\n }\n const out = new Uint8Array(s.length / 2);\n for (let i = 0; i < out.length; i++) {\n const byte = Number.parseInt(s.substring(i * 2, i * 2 + 2), 16);\n if (Number.isNaN(byte)) {\n throw new CryptoError('CRYPTO/INVALID_KEY', `invalid hex byte at position ${i * 2}`);\n }\n out[i] = byte;\n }\n return out;\n}\n\nexport function bytesToHex(u: Uint8Array): string {\n return Array.from(u, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n","import { ethers } from 'ethers';\nimport { CryptoError } from '../errors/index.js';\nimport { aesDecrypt, aesEncrypt } from './aes.js';\nimport { ECIES_MIN_BLOB, ECIES_PUBKEY_LENGTH, KEY_LENGTH } from './constants.js';\nimport { hkdfSha256 } from './hkdf.js';\nimport { assertUncompressedPubKey, bytesToHex, hexToBytes, strip } from './keys.js';\n\n/**\n * ECIES-secp256k1 encrypt to a recipient's uncompressed public key.\n * Wire format: [65 ephemeral pubkey][12 IV][16 tag][ciphertext].\n * Byte-compatible with backend/src/services/crypto.ts.\n */\nexport async function eciesEncrypt(plaintext: Uint8Array, recipientPubKey: string): Promise<Uint8Array> {\n assertUncompressedPubKey(recipientPubKey);\n const ephemeral = ethers.Wallet.createRandom();\n const shared = deriveSharedSecretX(ephemeral.privateKey, `0x${strip(recipientPubKey)}`);\n const aesKey = await hkdfSha256(shared, KEY_LENGTH);\n const aesBlob = await aesEncrypt(plaintext, aesKey);\n const ephPub = hexToBytes(strip(ephemeral.signingKey.publicKey));\n if (ephPub.byteLength !== ECIES_PUBKEY_LENGTH) {\n throw new CryptoError('CRYPTO/INVALID_KEY', `ephemeral pubkey length ${ephPub.byteLength}`);\n }\n const blob = new Uint8Array(ECIES_PUBKEY_LENGTH + aesBlob.byteLength);\n blob.set(ephPub, 0);\n blob.set(aesBlob, ECIES_PUBKEY_LENGTH);\n return blob;\n}\n\n/** ECIES-secp256k1 decrypt with the recipient's private key. */\nexport async function eciesDecrypt(blob: Uint8Array, recipientPrivKey: string): Promise<Uint8Array> {\n if (blob.byteLength < ECIES_MIN_BLOB) {\n throw new CryptoError(\n 'CRYPTO/INTEGRITY_CHECK',\n `ECIES blob too short: need ≥${ECIES_MIN_BLOB} bytes, got ${blob.byteLength}`,\n );\n }\n const ephPub = blob.subarray(0, ECIES_PUBKEY_LENGTH);\n const aesBlob = blob.subarray(ECIES_PUBKEY_LENGTH);\n const shared = deriveSharedSecretX(`0x${strip(recipientPrivKey)}`, `0x${bytesToHex(ephPub)}`);\n const aesKey = await hkdfSha256(shared, KEY_LENGTH);\n return aesDecrypt(aesBlob, aesKey);\n}\n\n/**\n * Compute the ECDH shared secret X coordinate (32 bytes) between a private key\n * and a peer's public key. Matches Node createECDH.computeSecret() output used by\n * the backend — ethers v6 returns 0x04||X||Y, so we slice X.\n */\nfunction deriveSharedSecretX(privHex: string, pubHex: string): Uint8Array {\n const sk = new ethers.SigningKey(privHex);\n const shared = sk.computeSharedSecret(pubHex);\n const bytes = hexToBytes(strip(shared));\n if (bytes.byteLength !== 65 || bytes[0] !== 0x04) {\n throw new CryptoError(\n 'CRYPTO/INVALID_KEY',\n `unexpected shared secret shape (len=${bytes.byteLength}, prefix=${bytes[0]?.toString(16) ?? 'none'})`,\n );\n }\n return bytes.subarray(1, 33);\n}\n","import { CryptoError } from '../errors/index.js';\nimport { aesDecrypt, aesEncrypt, generateAesKey } from './aes.js';\nimport { eciesEncrypt } from './ecies.js';\n\n/**\n * Evidence envelope — the single blob a worker uploads to Storage containing:\n * 1. The AES key wrapped to the agent's pubkey (so agent can decrypt later)\n * 2. The AES key wrapped to the TEE enclave's pubkey (so Sealed Inference can decrypt)\n * 3. The evidence ciphertext under that AES key\n *\n * Wire format (big-endian):\n * bytes 0..1 magic = 0x42 0x42 (\"BB\")\n * byte 2 version = 0x01\n * bytes 3..6 wrappedAgentLen (uint32)\n * bytes 7.. wrappedAgent (ECIES blob)\n * 4-byte uint32 wrappedEnclaveLen\n * bytes wrappedEnclave (ECIES blob)\n * bytes aesCiphertext (rest of the blob — AES blob [IV||tag||ct])\n *\n * The layout is versioned so we can rev it without breaking old blobs.\n */\n\nconst MAGIC_0 = 0x42;\nconst MAGIC_1 = 0x42;\nconst VERSION = 0x01;\nconst HEADER_LEN = 3;\n\nexport interface EvidenceEnvelope {\n wrappedForAgent: Uint8Array;\n wrappedForEnclave: Uint8Array;\n aesCiphertext: Uint8Array;\n}\n\nexport interface SealEvidenceInput {\n evidence: Uint8Array;\n agentPubKey: string;\n enclavePubKey: string;\n}\n\nexport interface SealEvidenceOutput {\n envelope: Uint8Array;\n aesKey: Uint8Array;\n}\n\n/**\n * Seal evidence for the agent + TEE enclave. Generates a fresh AES key,\n * encrypts the evidence, ECIES-wraps the key twice, and concatenates the\n * result as an EvidenceEnvelope. Returns both the on-wire envelope and\n * the raw AES key (for audit / diagnostic use — do NOT persist beyond\n * the submission).\n */\nexport async function sealEvidence(input: SealEvidenceInput): Promise<SealEvidenceOutput> {\n const aesKey = await generateAesKey();\n const aesCiphertext = await aesEncrypt(input.evidence, aesKey);\n const wrappedForAgent = await eciesEncrypt(aesKey, input.agentPubKey);\n const wrappedForEnclave = await eciesEncrypt(aesKey, input.enclavePubKey);\n const envelope = pack({ wrappedForAgent, wrappedForEnclave, aesCiphertext });\n return { envelope, aesKey };\n}\n\n/**\n * Open an evidence envelope as the agent — extracts the AES key wrapped\n * to the agent's pubkey, decrypts the ciphertext, and returns the plaintext\n * evidence. The enclave-wrapped key is ignored by agents (TEE-only).\n */\nexport async function openEvidenceAsAgent(\n envelope: Uint8Array,\n agentPrivKey: string,\n): Promise<Uint8Array> {\n const parsed = parse(envelope);\n const { eciesDecrypt } = await import('./ecies.js');\n const aesKey = await eciesDecrypt(parsed.wrappedForAgent, agentPrivKey);\n return aesDecrypt(parsed.aesCiphertext, aesKey);\n}\n\nfunction pack(parts: EvidenceEnvelope): Uint8Array {\n const { wrappedForAgent, wrappedForEnclave, aesCiphertext } = parts;\n const total =\n HEADER_LEN +\n 4 + wrappedForAgent.byteLength +\n 4 + wrappedForEnclave.byteLength +\n aesCiphertext.byteLength;\n const out = new Uint8Array(total);\n const view = new DataView(out.buffer);\n let off = 0;\n out[off++] = MAGIC_0;\n out[off++] = MAGIC_1;\n out[off++] = VERSION;\n view.setUint32(off, wrappedForAgent.byteLength, false);\n off += 4;\n out.set(wrappedForAgent, off);\n off += wrappedForAgent.byteLength;\n view.setUint32(off, wrappedForEnclave.byteLength, false);\n off += 4;\n out.set(wrappedForEnclave, off);\n off += wrappedForEnclave.byteLength;\n out.set(aesCiphertext, off);\n return out;\n}\n\nfunction parse(blob: Uint8Array): EvidenceEnvelope {\n if (blob.byteLength < HEADER_LEN + 4 + 4) {\n throw new CryptoError('CRYPTO/INTEGRITY_CHECK', `envelope too short: ${blob.byteLength}`);\n }\n if (blob[0] !== MAGIC_0 || blob[1] !== MAGIC_1) {\n throw new CryptoError('CRYPTO/INTEGRITY_CHECK', 'bad envelope magic');\n }\n if (blob[2] !== VERSION) {\n throw new CryptoError('CRYPTO/UNSUPPORTED_CIPHER', `unknown envelope version ${blob[2]}`);\n }\n const view = new DataView(blob.buffer, blob.byteOffset, blob.byteLength);\n let off = HEADER_LEN;\n const agentLen = view.getUint32(off, false);\n off += 4;\n if (off + agentLen + 4 > blob.byteLength) {\n throw new CryptoError('CRYPTO/INTEGRITY_CHECK', 'envelope truncated (agent)');\n }\n const wrappedForAgent = blob.slice(off, off + agentLen);\n off += agentLen;\n const enclaveLen = view.getUint32(off, false);\n off += 4;\n if (off + enclaveLen > blob.byteLength) {\n throw new CryptoError('CRYPTO/INTEGRITY_CHECK', 'envelope truncated (enclave)');\n }\n const wrappedForEnclave = blob.slice(off, off + enclaveLen);\n off += enclaveLen;\n const aesCiphertext = blob.slice(off);\n return { wrappedForAgent, wrappedForEnclave, aesCiphertext };\n}\n\nexport const __internals = { pack, parse };\n","import type { BlindEscrowClient, OnChainTask, TaskRegistryClient } from '../chain/index.js';\nimport { aesDecrypt, eciesDecrypt, sealEvidence } from '../crypto/index.js';\nimport type { EventBus, SdkEvents } from '../events/index.js';\nimport type { Signer } from '../signer/index.js';\nimport type { Storage } from '../storage/index.js';\nimport type { Hex, RootHash, TaskId, TxReceiptLike } from '../types.js';\n\nexport interface WorkerDeps {\n escrow: BlindEscrowClient;\n registry: TaskRegistryClient;\n storage: Storage;\n signer: Signer;\n events?: EventBus<SdkEvents>;\n}\n\nexport interface DecryptInstructionsInput {\n /** ECIES-wrapped AES key delivered out-of-band by the agent (e.g. via the backend API). */\n wrappedKey: Uint8Array;\n /** Worker's private key, hex with or without 0x prefix. */\n workerPrivKey: string;\n /** Storage root hash from the on-chain task metadata. */\n taskHash: RootHash;\n}\n\nexport interface SubmitEvidenceInput {\n taskId: TaskId;\n evidence: string | Uint8Array;\n /** Agent's uncompressed secp256k1 pubkey (retrieved via the backend or chain). */\n agentPubKey: string;\n /** TEE enclave pubkey for Sealed Inference (from 0G Compute broker). */\n enclavePubKey: string;\n}\n\nexport interface SubmitEvidenceResult {\n rootHash: RootHash;\n txHash: Hex;\n receipt: TxReceiptLike;\n}\n\n/**\n * Worker-side flows: browse open tasks, decrypt assigned instructions, seal\n * evidence for agent + TEE, and claim payment after the deadline if\n * verification stalls. Peer pubkeys and wrapped keys are passed explicitly;\n * the SDK does not assume a specific message-passing substrate.\n */\nexport class Worker {\n constructor(private readonly deps: WorkerDeps) {}\n\n async browse(offset: bigint, limit: bigint): Promise<TaskId[]> {\n return this.deps.registry.getOpenTasks(offset, limit);\n }\n\n async getTaskDetail(taskId: TaskId): Promise<OnChainTask> {\n return this.deps.escrow.getTask(taskId);\n }\n\n async decryptInstructions(input: DecryptInstructionsInput): Promise<Uint8Array> {\n const aesKey = await eciesDecrypt(input.wrappedKey, input.workerPrivKey);\n const ciphertext = await this.deps.storage.download(input.taskHash);\n return aesDecrypt(ciphertext, aesKey);\n }\n\n async submitEvidence(input: SubmitEvidenceInput): Promise<SubmitEvidenceResult> {\n const evidenceBytes = typeof input.evidence === 'string'\n ? new TextEncoder().encode(input.evidence)\n : input.evidence;\n\n const { envelope } = await sealEvidence({\n evidence: evidenceBytes,\n agentPubKey: input.agentPubKey,\n enclavePubKey: input.enclavePubKey,\n });\n\n const uploaded = await this.deps.storage.upload(envelope);\n const rootHash = uploaded.rootHash;\n\n const receipt = await this.deps.escrow.submitEvidence(input.taskId, rootHash);\n\n this.deps.events?.emit('evidence.submitted', {\n taskId: input.taskId,\n rootHash,\n txHash: receipt.hash,\n });\n\n return { rootHash, txHash: receipt.hash, receipt };\n }\n\n /**\n * Worker escape hatch: reclaim escrow after the deadline if completeVerification\n * was never called. Payment released per contract logic (85% worker, 15% treasury\n * or full refund depending on submission state — see BlindEscrow.claimTimeout).\n */\n async claimTimeout(taskId: TaskId): Promise<TxReceiptLike> {\n const receipt = await this.deps.escrow.claimTimeout(taskId);\n this.deps.events?.emit('payment.claimed', { taskId, txHash: receipt.hash, amount: 0n });\n return receipt;\n }\n}\n"]}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent → Worker end-to-end demo, using MemoryStorage + a mock escrow so the
|
|
3
|
+
* script runs anywhere without an RPC or funded wallet. Shows the full flow:
|
|
4
|
+
*
|
|
5
|
+
* 1. Agent creates an encrypted task (AES-encrypt instructions, upload blob)
|
|
6
|
+
* 2. Agent assigns a worker (ECIES-wrap the AES key to worker's pubkey)
|
|
7
|
+
* 3. Worker decrypts the instructions
|
|
8
|
+
* 4. Worker submits evidence (seals a dual-recipient envelope for agent + TEE)
|
|
9
|
+
* 5. Agent decrypts the evidence
|
|
10
|
+
*
|
|
11
|
+
* Run from sdk/: npx tsx examples/agent-demo.ts
|
|
12
|
+
*
|
|
13
|
+
* For the real chain, swap MockEscrow for `new ChainClient({ network, signer }).escrow`
|
|
14
|
+
* and swap MemoryStorage for `new ZgStorage({ indexerUrl, rpcUrl, signer: ethersWallet })`.
|
|
15
|
+
*/
|
|
16
|
+
import { Agent } from '../src/agent/index.js';
|
|
17
|
+
import type { BlindEscrowClient, CreateTaskArgs } from '../src/chain/index.js';
|
|
18
|
+
import { generateKeyPair } from '../src/crypto/index.js';
|
|
19
|
+
import { EventBus, type SdkEvents } from '../src/events/index.js';
|
|
20
|
+
import { InMemoryKeyStore } from '../src/keystore/index.js';
|
|
21
|
+
import { PrivateKeySigner } from '../src/signer/index.js';
|
|
22
|
+
import { MemoryStorage } from '../src/storage/index.js';
|
|
23
|
+
import type { Address, Hex, RootHash, TaskId, TxReceiptLike } from '../src/types.js';
|
|
24
|
+
import { Worker } from '../src/worker/index.js';
|
|
25
|
+
|
|
26
|
+
// ── Mock escrow for offline demo (use real ChainClient in production) ──
|
|
27
|
+
class MockEscrow {
|
|
28
|
+
private nextId = 1n;
|
|
29
|
+
private evidenceByTask = new Map<string, RootHash>();
|
|
30
|
+
async createTask(args: CreateTaskArgs) {
|
|
31
|
+
const taskId = this.nextId++;
|
|
32
|
+
return { taskId, receipt: r('0xa') };
|
|
33
|
+
}
|
|
34
|
+
async assignWorker(_taskId: TaskId, _worker: Address) { return r('0xb'); }
|
|
35
|
+
async cancelTask(_taskId: TaskId) { return r('0xc'); }
|
|
36
|
+
async submitEvidence(taskId: TaskId, evidenceHash: Hex) {
|
|
37
|
+
this.evidenceByTask.set(taskId.toString(), evidenceHash as RootHash);
|
|
38
|
+
return r('0xd');
|
|
39
|
+
}
|
|
40
|
+
getEvidenceHash(taskId: TaskId) { return this.evidenceByTask.get(taskId.toString()); }
|
|
41
|
+
}
|
|
42
|
+
function r(prefix: string): TxReceiptLike {
|
|
43
|
+
return { hash: (prefix + 'f'.repeat(63 - prefix.length + 2)).slice(0, 66) as Hex, blockNumber: 1, gasUsed: 21000n };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ── Shared deps ──
|
|
47
|
+
const AGENT_PK = '0x' + '1'.repeat(64);
|
|
48
|
+
const WORKER_PK = '0x' + '2'.repeat(64);
|
|
49
|
+
const USDC = '0x317227efcA18D004E12CA8046AEf7E1597458F25' as Address;
|
|
50
|
+
|
|
51
|
+
const storage = new MemoryStorage();
|
|
52
|
+
const escrow = new MockEscrow();
|
|
53
|
+
const events = new EventBus<SdkEvents>();
|
|
54
|
+
events.on('task.created', (p) => console.log(` • task.created taskId=${p.taskId} rootHash=${p.rootHash.slice(0, 18)}…`));
|
|
55
|
+
events.on('task.assigned', (p) => console.log(` • task.assigned taskId=${p.taskId} worker=${p.worker.slice(0, 10)}…`));
|
|
56
|
+
events.on('evidence.submitted', (p) => console.log(` • evidence.submitted taskId=${p.taskId} rootHash=${p.rootHash.slice(0, 18)}…`));
|
|
57
|
+
|
|
58
|
+
// ── Identities ──
|
|
59
|
+
const agentSigner = new PrivateKeySigner(AGENT_PK);
|
|
60
|
+
const workerSigner = new PrivateKeySigner(WORKER_PK);
|
|
61
|
+
const agentPubKey = await agentSigner.getPublicKey();
|
|
62
|
+
const workerPubKey = await workerSigner.getPublicKey();
|
|
63
|
+
const workerAddr = (await workerSigner.getAddress()) as Address;
|
|
64
|
+
const enclaveKeys = generateKeyPair(); // TEE pubkey — fetched from broker in production
|
|
65
|
+
|
|
66
|
+
const agent = new Agent({
|
|
67
|
+
// biome-ignore lint/suspicious/noExplicitAny: demo mock
|
|
68
|
+
escrow: escrow as any as BlindEscrowClient,
|
|
69
|
+
storage,
|
|
70
|
+
keystore: new InMemoryKeyStore(),
|
|
71
|
+
signer: agentSigner,
|
|
72
|
+
events,
|
|
73
|
+
});
|
|
74
|
+
const worker = new Worker({
|
|
75
|
+
// biome-ignore lint/suspicious/noExplicitAny: demo mock
|
|
76
|
+
escrow: escrow as any as BlindEscrowClient,
|
|
77
|
+
// biome-ignore lint/suspicious/noExplicitAny: demo: no registry needed for this path
|
|
78
|
+
registry: null as any,
|
|
79
|
+
storage,
|
|
80
|
+
signer: workerSigner,
|
|
81
|
+
events,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// ── 1. Agent creates an encrypted task ──
|
|
85
|
+
console.log('\n[1] Agent creates encrypted task');
|
|
86
|
+
const created = await agent.createTask({
|
|
87
|
+
instructions: 'Take 3 photos of the storefront at 123 Main St, Lagos',
|
|
88
|
+
category: 'photography',
|
|
89
|
+
locationZone: 'Lagos, NG',
|
|
90
|
+
reward: { token: USDC, amount: 5_000000n },
|
|
91
|
+
deadline: new Date(Date.now() + 24 * 3600_000),
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// ── 2. Agent assigns the worker ──
|
|
95
|
+
console.log('\n[2] Agent assigns worker (wraps AES key to worker pubkey)');
|
|
96
|
+
const { wrappedKey } = await agent.assignWorker(created.taskId, workerAddr, workerPubKey);
|
|
97
|
+
|
|
98
|
+
// ── 3. Worker decrypts the instructions ──
|
|
99
|
+
console.log('\n[3] Worker decrypts instructions');
|
|
100
|
+
const instructions = await worker.decryptInstructions({
|
|
101
|
+
wrappedKey,
|
|
102
|
+
workerPrivKey: WORKER_PK,
|
|
103
|
+
taskHash: created.rootHash,
|
|
104
|
+
});
|
|
105
|
+
console.log(` → "${new TextDecoder().decode(instructions)}"`);
|
|
106
|
+
|
|
107
|
+
// ── 4. Worker submits evidence ──
|
|
108
|
+
console.log('\n[4] Worker submits evidence (dual-recipient envelope: agent + TEE)');
|
|
109
|
+
const submitted = await worker.submitEvidence({
|
|
110
|
+
taskId: created.taskId,
|
|
111
|
+
evidence: 'photo1.jpg photo2.jpg photo3.jpg (attached)',
|
|
112
|
+
agentPubKey,
|
|
113
|
+
enclavePubKey: enclaveKeys.publicKey,
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// ── 5. Agent fetches + decrypts evidence ──
|
|
117
|
+
console.log('\n[5] Agent decrypts evidence');
|
|
118
|
+
const recovered = await agent.fetchAndDecryptEvidence(submitted.rootHash, AGENT_PK);
|
|
119
|
+
console.log(` → "${new TextDecoder().decode(recovered)}"`);
|
|
120
|
+
|
|
121
|
+
console.log('\n✓ full lifecycle completed');
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@blindmarket/sdk",
|
|
3
|
+
"version": "0.1.4",
|
|
4
|
+
"description": "BlindMarket SDK — deploy agents, post tasks, assign workers, verify evidence",
|
|
5
|
+
"author": "BlindMarket Team",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"homepage": "https://github.com/JemIIahh/BlindMarket#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/JemIIahh/BlindMarket.git",
|
|
11
|
+
"directory": "sdk"
|
|
12
|
+
},
|
|
13
|
+
"keywords": [
|
|
14
|
+
"blindmarket",
|
|
15
|
+
"ai-agents",
|
|
16
|
+
"web3",
|
|
17
|
+
"0g",
|
|
18
|
+
"tee",
|
|
19
|
+
"privacy",
|
|
20
|
+
"escrow",
|
|
21
|
+
"bounty",
|
|
22
|
+
"blockchain",
|
|
23
|
+
"encrypted",
|
|
24
|
+
"agent-to-human"
|
|
25
|
+
],
|
|
26
|
+
"type": "module",
|
|
27
|
+
"main": "./dist/index.js",
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"exports": {
|
|
30
|
+
".": {
|
|
31
|
+
"import": "./dist/index.js",
|
|
32
|
+
"types": "./dist/index.d.ts"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc",
|
|
37
|
+
"dev": "tsc --watch"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"ethers": "6.13.1"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^22.15.3",
|
|
44
|
+
"typescript": "^5.7.3"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Generates cross-compat crypto fixtures using Node's built-in crypto, matching
|
|
4
|
+
* backend/src/services/crypto.ts byte-for-byte. The SDK's test/crypto.compat.test.ts
|
|
5
|
+
* loads these and verifies WebCrypto-based decryption produces the same plaintext.
|
|
6
|
+
*
|
|
7
|
+
* Run: node scripts/gen-crypto-fixtures.mjs
|
|
8
|
+
* Output: test/fixtures/crypto.json (committed to the repo; regenerate only on
|
|
9
|
+
* intentional wire-format changes).
|
|
10
|
+
*/
|
|
11
|
+
import { createCipheriv, createECDH, hkdfSync, randomBytes } from 'node:crypto';
|
|
12
|
+
import { writeFileSync } from 'node:fs';
|
|
13
|
+
import { dirname, resolve } from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
|
|
16
|
+
const IV_LENGTH = 12;
|
|
17
|
+
const TAG_LENGTH = 16;
|
|
18
|
+
const KEY_LENGTH = 32;
|
|
19
|
+
const ECIES_HKDF_INFO = 'BlindMarket-ECIES-v1';
|
|
20
|
+
|
|
21
|
+
function aesEncrypt(plaintext, key) {
|
|
22
|
+
const iv = randomBytes(IV_LENGTH);
|
|
23
|
+
const cipher = createCipheriv('aes-256-gcm', key, iv, { authTagLength: TAG_LENGTH });
|
|
24
|
+
const encrypted = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
25
|
+
const tag = cipher.getAuthTag();
|
|
26
|
+
// [IV][tag][ciphertext] — matches backend/src/services/crypto.ts
|
|
27
|
+
return Buffer.concat([iv, tag, encrypted]);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function eciesEncrypt(plaintext, recipientPubKeyBuf) {
|
|
31
|
+
const ephemeral = createECDH('secp256k1');
|
|
32
|
+
ephemeral.generateKeys();
|
|
33
|
+
const shared = ephemeral.computeSecret(recipientPubKeyBuf);
|
|
34
|
+
const aesKey = Buffer.from(hkdfSync('sha256', shared, '', ECIES_HKDF_INFO, KEY_LENGTH));
|
|
35
|
+
const aesBlob = aesEncrypt(plaintext, aesKey);
|
|
36
|
+
return Buffer.concat([ephemeral.getPublicKey(), aesBlob]);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const recipient = createECDH('secp256k1');
|
|
40
|
+
recipient.generateKeys();
|
|
41
|
+
const privateKey = recipient.getPrivateKey('hex');
|
|
42
|
+
const publicKey = recipient.getPublicKey('hex', 'uncompressed');
|
|
43
|
+
|
|
44
|
+
const plaintext = 'hello cross-compat';
|
|
45
|
+
const ptBuf = Buffer.from(plaintext, 'utf-8');
|
|
46
|
+
|
|
47
|
+
// AES fixture
|
|
48
|
+
const aesKey = randomBytes(KEY_LENGTH);
|
|
49
|
+
const aesBlob = aesEncrypt(ptBuf, aesKey);
|
|
50
|
+
|
|
51
|
+
// ECIES fixture (recipient's pubkey is encoded as Buffer for computeSecret)
|
|
52
|
+
const eciesBlob = eciesEncrypt(ptBuf, Buffer.from(publicKey, 'hex'));
|
|
53
|
+
|
|
54
|
+
const fixture = {
|
|
55
|
+
_note:
|
|
56
|
+
'Generated by scripts/gen-crypto-fixtures.mjs using Node built-in crypto, matching backend/src/services/crypto.ts. If the SDK decrypts these back to the expected plaintext, wire-format compatibility is proven. Regenerate only on intentional format changes.',
|
|
57
|
+
hkdf_info: ECIES_HKDF_INFO,
|
|
58
|
+
keypair: { privateKey, publicKey },
|
|
59
|
+
plaintext,
|
|
60
|
+
aes: {
|
|
61
|
+
key: aesKey.toString('hex'),
|
|
62
|
+
blob: aesBlob.toString('hex'),
|
|
63
|
+
},
|
|
64
|
+
ecies: {
|
|
65
|
+
blob: eciesBlob.toString('hex'),
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
70
|
+
const out = resolve(__dirname, '..', 'test', 'fixtures', 'crypto.json');
|
|
71
|
+
writeFileSync(out, `${JSON.stringify(fixture, null, 2)}\n`);
|
|
72
|
+
console.log(`wrote ${out}`);
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { BlindEscrowClient } from '../chain/index.js';
|
|
2
|
+
import {
|
|
3
|
+
aesEncrypt,
|
|
4
|
+
eciesEncrypt,
|
|
5
|
+
generateAesKey,
|
|
6
|
+
openEvidenceAsAgent,
|
|
7
|
+
} from '../crypto/index.js';
|
|
8
|
+
import { LifecycleError } from '../errors/index.js';
|
|
9
|
+
import type { EventBus, SdkEvents } from '../events/index.js';
|
|
10
|
+
import type { KeyStore } from '../keystore/index.js';
|
|
11
|
+
import type { Signer } from '../signer/index.js';
|
|
12
|
+
import type { Storage } from '../storage/index.js';
|
|
13
|
+
import type { Address, Hex, Reward, TaskId, TaskKey, TxReceiptLike } from '../types.js';
|
|
14
|
+
|
|
15
|
+
export interface AgentDeps {
|
|
16
|
+
escrow: BlindEscrowClient;
|
|
17
|
+
storage: Storage;
|
|
18
|
+
keystore: KeyStore;
|
|
19
|
+
signer: Signer;
|
|
20
|
+
events?: EventBus<SdkEvents>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface CreateTaskInput {
|
|
24
|
+
instructions: string | Uint8Array;
|
|
25
|
+
category: string;
|
|
26
|
+
locationZone: string;
|
|
27
|
+
reward: Reward & { token: Address };
|
|
28
|
+
deadline: Date | bigint;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface CreateTaskResult {
|
|
32
|
+
taskId: TaskId;
|
|
33
|
+
taskKey: TaskKey;
|
|
34
|
+
rootHash: Hex;
|
|
35
|
+
txHash: Hex;
|
|
36
|
+
receipt: TxReceiptLike;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface AssignWorkerResult {
|
|
40
|
+
wrappedKey: Uint8Array;
|
|
41
|
+
receipt: TxReceiptLike;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* End-to-end agent flows. Composes storage + crypto + chain + keystore so a
|
|
46
|
+
* caller can post an encrypted bounty in one call. Key exchange with the
|
|
47
|
+
* worker is intentionally out-of-band: assignWorker() returns the wrapped
|
|
48
|
+
* AES key as bytes, and the caller is responsible for delivering it (backend
|
|
49
|
+
* API, DM, whatever). This keeps the SDK pluggable across different
|
|
50
|
+
* message-passing substrates.
|
|
51
|
+
*/
|
|
52
|
+
export class Agent {
|
|
53
|
+
constructor(private readonly deps: AgentDeps) {}
|
|
54
|
+
|
|
55
|
+
async createTask(input: CreateTaskInput): Promise<CreateTaskResult> {
|
|
56
|
+
const { storage, escrow, keystore, events } = this.deps;
|
|
57
|
+
|
|
58
|
+
const aesKey = await generateAesKey();
|
|
59
|
+
const plaintext = toBytes(input.instructions);
|
|
60
|
+
const ciphertext = await aesEncrypt(plaintext, aesKey);
|
|
61
|
+
|
|
62
|
+
const uploaded = await storage.upload(ciphertext);
|
|
63
|
+
const rootHash = uploaded.rootHash;
|
|
64
|
+
|
|
65
|
+
const deadline = typeof input.deadline === 'bigint' ? input.deadline : BigInt(Math.floor(input.deadline.getTime() / 1000));
|
|
66
|
+
|
|
67
|
+
const { taskId, receipt } = await escrow.createTask({
|
|
68
|
+
taskHash: rootHash,
|
|
69
|
+
token: input.reward.token as Address,
|
|
70
|
+
amount: input.reward.amount,
|
|
71
|
+
category: input.category,
|
|
72
|
+
locationZone: input.locationZone,
|
|
73
|
+
deadline,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const taskKey: TaskKey = { aesKey, createdAt: new Date() };
|
|
77
|
+
await keystore.putTaskKey(taskId, taskKey);
|
|
78
|
+
|
|
79
|
+
events?.emit('task.created', { taskId, txHash: receipt.hash, rootHash });
|
|
80
|
+
return { taskId, taskKey, rootHash, txHash: receipt.hash, receipt };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Wrap the stored AES key for the chosen worker and record the assignment
|
|
85
|
+
* on-chain. The caller must deliver `wrappedKey` to the worker separately
|
|
86
|
+
* (backend API, DM, etc.). Returns the wrapped bytes and the tx receipt.
|
|
87
|
+
*/
|
|
88
|
+
async assignWorker(taskId: TaskId, worker: Address, workerPubKey: string): Promise<AssignWorkerResult> {
|
|
89
|
+
const { keystore, escrow, events } = this.deps;
|
|
90
|
+
const stored = await keystore.getTaskKey(taskId);
|
|
91
|
+
if (!stored) {
|
|
92
|
+
throw new LifecycleError('LIFECYCLE/TASK_NOT_FOUND', `no task key in keystore for task ${taskId}`);
|
|
93
|
+
}
|
|
94
|
+
const wrappedKey = await eciesEncrypt(stored.aesKey, workerPubKey);
|
|
95
|
+
const receipt = await escrow.assignWorker(taskId, worker);
|
|
96
|
+
events?.emit('task.assigned', { taskId, worker, txHash: receipt.hash });
|
|
97
|
+
return { wrappedKey, receipt };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async cancelTask(taskId: TaskId): Promise<TxReceiptLike> {
|
|
101
|
+
const { escrow, keystore, events } = this.deps;
|
|
102
|
+
const receipt = await this.deps.escrow.cancelTask(taskId);
|
|
103
|
+
void escrow;
|
|
104
|
+
await keystore.delete(taskId);
|
|
105
|
+
events?.emit('task.cancelled', { taskId, txHash: receipt.hash });
|
|
106
|
+
return receipt;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Fetch evidence by root hash, unwrap the AES key with the agent's private
|
|
111
|
+
* key (signer's key material is not accessible, so a raw private key is
|
|
112
|
+
* required), and return the decrypted evidence plaintext.
|
|
113
|
+
*/
|
|
114
|
+
async fetchAndDecryptEvidence(evidenceHash: Hex, agentPrivKey: string): Promise<Uint8Array> {
|
|
115
|
+
const envelope = await this.deps.storage.download(evidenceHash);
|
|
116
|
+
return openEvidenceAsAgent(envelope, agentPrivKey);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function toBytes(x: string | Uint8Array): Uint8Array {
|
|
121
|
+
return typeof x === 'string' ? new TextEncoder().encode(x) : x;
|
|
122
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Agent.js';
|
package/src/api/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|