{"_id":"@backbay/witness","_rev":"2-4be49f7e2a3d5bab91427a76ee3ae93c","name":"@backbay/witness","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0-alpha.1":{"name":"@backbay/witness","version":"0.1.0-alpha.1","keywords":["backbay","verification","attestation","wasm","ed25519","merkle","witness"],"license":"MIT","_id":"@backbay/witness@0.1.0-alpha.1","maintainers":[{"name":"bbconnor","email":"connor@backbay.io"}],"homepage":"https://github.com/backbay/witness#readme","bugs":{"url":"https://github.com/backbay/witness/issues"},"dist":{"shasum":"414bc58b010145d42281974bb81df9715c7e8296","tarball":"https://registry.npmjs.org/@backbay/witness/-/witness-0.1.0-alpha.1.tgz","fileCount":30,"integrity":"sha512-6IXyEwhDyif7Jvha6hydQf8sZKJdladf+BvFw+XmCnPS32c2iRw5Ua1iwNUUCnfJk3/AQpMQk/2duvJ+EBiOEQ==","signatures":[{"sig":"MEUCIQCTlbdExo0FZagTjPovQPUGud1kK2ezxWl8MGMRjpYqggIgLVwxFfNGHxbS6Sjo3djomUw6OMMU8ada0jI1HarG6Jc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125254},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./wasm":{"types":"./wasm/cyntra_trust_wasm.d.ts","import":"./wasm/cyntra_trust_wasm.js"}},"gitHead":"6acb228d8f36242cee30398c351fd139a146f1ec","scripts":{"dev":"tsc --watch","test":"vitest","build":"tsc","clean":"rm -rf dist","test:run":"vitest run","prepublishOnly":"npm run build"},"_npmUser":{"name":"bbconnor","email":"connor@backbay.io"},"repository":{"url":"git+https://github.com/backbay/witness.git","type":"git"},"_npmVersion":"10.8.2","description":"Browser-side verification of Backbay attestations","directories":{},"_nodeVersion":"20.20.0","dependencies":{"viem":"^2.0.0","@solana/web3.js":"^1.91.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.2.0","typescript":"^5.3.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/witness_0.1.0-alpha.1_1770318660391_0.7085355666628899","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@backbay/witness","version":"0.1.0","description":"Browser-side verification of Backbay attestations","publishConfig":{"access":"public"},"type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"},"./wasm":{"import":"./wasm/cyntra_trust_wasm.js","types":"./wasm/cyntra_trust_wasm.d.ts"}},"sideEffects":false,"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest","clean":"rm -rf dist","prepublishOnly":"npm run build"},"dependencies":{"@solana/web3.js":"^1.91.0","viem":"^2.0.0"},"devDependencies":{"@types/node":"^20.0.0","tsup":"^8.5.1","typescript":"^5.9.3","vitest":"^2.0.0"},"keywords":["backbay","verification","attestation","wasm","ed25519","merkle","witness"],"author":{"name":"Backbay","email":"dev@backbay.industries"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/backbay/backbay-sdk.git","directory":"packages/witness"},"bugs":{"url":"https://github.com/backbay/backbay-sdk/issues"},"homepage":"https://github.com/backbay/backbay-sdk/tree/main/packages/witness#readme","_id":"@backbay/witness@0.1.0","gitHead":"ae09bc8a0404f61abefc257033578911f024260d","_nodeVersion":"20.20.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-uJq9NZT/SA2W2bDiLYXwCVK4pqxYSngxUIA8ulptR5HIy+M/H82PrHCr+Jmp3N4DqERYnhMC7X8bYzXa2LCxsg==","shasum":"948db68a2f8c21755a1de9eda30d73153c39eb67","tarball":"https://registry.npmjs.org/@backbay/witness/-/witness-0.1.0.tgz","fileCount":16,"unpackedSize":122606,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCiWoeHlla5fkBoSeGPABTtI9+PqXs91sKReUM4hr0cogIhAMi86naAF3maZu2zDY8PMPbPpHL1NUPpq5e9oC7FMPNA"}]},"_npmUser":{"name":"bbconnor","email":"connor@backbay.io"},"directories":{},"maintainers":[{"name":"bbconnor","email":"connor@backbay.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/witness_0.1.0_1771888514970_0.30841256068725986"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-05T19:11:00.297Z","modified":"2026-02-23T23:15:15.286Z","0.1.0-alpha.1":"2026-02-05T19:11:00.544Z","0.1.0":"2026-02-23T23:15:15.124Z"},"bugs":{"url":"https://github.com/backbay/backbay-sdk/issues"},"license":"MIT","homepage":"https://github.com/backbay/backbay-sdk/tree/main/packages/witness#readme","keywords":["backbay","verification","attestation","wasm","ed25519","merkle","witness"],"repository":{"type":"git","url":"git+https://github.com/backbay/backbay-sdk.git","directory":"packages/witness"},"description":"Browser-side verification of Backbay attestations","maintainers":[{"name":"bbconnor","email":"connor@backbay.io"}],"readme":"# @backbay/witness\n\nBrowser-side verification of Backbay attestations using WebAssembly.\n\n## Features\n\n- **Ed25519 signature verification** - Verify kernel, verifier, and provider signatures\n- **Merkle proof verification** - Validate event inclusion proofs\n- **SHA-256 and Keccak-256 hashing** - Compute hashes for receipt verification\n- **Chain fetchers** - Fetch attestations from Rekor, EAS, and Solana\n- **<200KB gzipped** - Lightweight WASM bundle\n\n## Installation\n\n```bash\nnpm install @backbay/witness\n# or\nbun add @backbay/witness\n```\n\n## Usage\n\n```typescript\nimport {\n  initWasm,\n  verifyReceipt,\n  fetchAndVerifyChain,\n  sha256,\n  verifyMerkleProof,\n} from '@backbay/witness';\n\n// Initialize WASM (call once at startup)\nawait initWasm();\n\n// Verify a signed receipt\nconst result = verifyReceipt(signedReceipt, {\n  kernel: '0xabc123...',\n  verifier: '0xdef456...',\n});\n\nif (result.valid) {\n  console.log('All signatures valid!');\n} else {\n  console.error('Verification failed:', result.errors);\n}\n\n// Verify complete attestation chain\nconst chain = await fetchAndVerifyChain(receiptId, {\n  rekor: true,\n  eas: { chainId: 8453 }, // Base\n  solana: { cluster: 'mainnet-beta' },\n});\n\nconsole.log('Rekor:', chain.rekor?.verified);\nconsole.log('EAS:', chain.eas?.verified);\nconsole.log('Solana:', chain.solana?.verified);\n```\n\n## API\n\n### Core Functions\n\n#### `initWasm(): Promise<void>`\n\nInitialize the WASM module. Must be called before any verification.\n\n#### `verifyReceipt(receipt, publicKeys): VerificationResult`\n\nVerify a signed RunReceipt against public keys.\n\n#### `verifyMerkleProof(leafHash, proof, root): boolean`\n\nVerify a Merkle inclusion proof.\n\n#### `sha256(data: Uint8Array): string`\n\nCompute SHA-256 hash.\n\n#### `keccak256(data: Uint8Array): string`\n\nCompute Keccak-256 hash (Ethereum-compatible).\n\n#### `verifySignature(publicKey, message, signature): boolean`\n\nVerify an Ed25519 signature.\n\n### Chain Verification\n\n#### `fetchAndVerifyChain(receiptId, options): Promise<AttestationChain>`\n\nFetch and verify attestations from multiple sources:\n- **Rekor** - Sigstore transparency log\n- **EAS** - Ethereum Attestation Service\n- **Solana** - Aegis Registry\n\n## Configuration\n\nAll chain verifiers support custom configuration for endpoints, program IDs, and RPC URLs. This allows using private infrastructure without forking the code.\n\n### Simple Configuration\n\n```typescript\nconst chain = await fetchAndVerifyChain(receiptHash, {\n  rekor: true,\n  eas: { chainId: 8453 },           // Base\n  solana: { cluster: 'devnet' },\n});\n```\n\n### Advanced Configuration\n\n```typescript\nconst chain = await fetchAndVerifyChain(receiptHash, {\n  rekor: true,\n  eas: {\n    chainId: 8453,\n    graphqlUrl: 'https://my-graphql.example.com',  // Custom GraphQL\n    rpcUrl: 'https://my-rpc.example.com',          // Custom RPC\n  },\n  solana: {\n    cluster: 'mainnet-beta',\n    rpcUrl: 'https://my-solana-rpc.example.com',   // Custom RPC\n    programIds: {\n      registryProgramId: 'MyProgramId...',         // Custom program\n    },\n    commitment: 'finalized',                        // Commitment level\n  },\n});\n```\n\n### Solana Configuration\n\nThe Solana fetcher supports these options:\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `cluster` | `'mainnet-beta' \\| 'devnet' \\| 'testnet'` | Required | Solana cluster |\n| `rpcUrl` | `string` | Public cluster endpoint | Custom RPC endpoint |\n| `programIds.registryProgramId` | `string` | From `infra/solana/program_ids.json` | Aegis Registry program ID |\n| `programIds.feeMarketProgramId` | `string` | None | Aegis Fee Market program ID |\n| `commitment` | `'processed' \\| 'confirmed' \\| 'finalized'` | `'confirmed'` | Connection commitment |\n\n**Direct Solana fetcher usage:**\n\n```typescript\nimport { fetchFromSolana, SolanaConfig } from '@backbay/witness/fetchers/solana';\n\nconst config: SolanaConfig = {\n  cluster: 'devnet',\n  rpcUrl: 'https://my-rpc.example.com',\n  programIds: {\n    registryProgramId: '5612LDBwkX4voFX4PP3mwHnrVigveTEXDxH7tAaxN5P8',\n  },\n};\n\nconst result = await fetchFromSolana(receiptHash, config);\n```\n\n**Default program IDs** are sourced from `infra/solana/program_ids.json`:\n\n| Cluster | Registry Program ID |\n|---------|---------------------|\n| devnet | `5612LDBwkX4voFX4PP3mwHnrVigveTEXDxH7tAaxN5P8` |\n| mainnet-beta | Not deployed |\n| testnet | Not deployed |\n\n### EAS Configuration\n\nThe EAS fetcher supports these options:\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `chainId` | `number` | Required | EVM chain ID |\n| `graphqlUrl` | `string` | Public EASScan endpoint | Custom GraphQL endpoint |\n| `rpcUrl` | `string` | Public RPC | Custom RPC for tx lookups |\n\n**Supported chains:**\n\n| Chain | ID | Default GraphQL Endpoint |\n|-------|-----|-------------------------|\n| Ethereum | 1 | `https://easscan.org/graphql` |\n| Optimism | 10 | `https://optimism.easscan.org/graphql` |\n| Arbitrum | 42161 | `https://arbitrum.easscan.org/graphql` |\n| Base | 8453 | `https://base.easscan.org/graphql` |\n\n**Direct EAS fetcher usage:**\n\n```typescript\nimport { fetchFromEAS, EASConfig } from '@backbay/witness/fetchers/eas';\n\nconst config: EASConfig = {\n  chainId: 8453,\n  graphqlUrl: 'https://my-graphql.example.com',\n  rpcUrl: 'https://my-rpc.example.com',\n};\n\nconst result = await fetchFromEAS(receiptHash, config);\n```\n\n### Helper Functions\n\nThe Solana module exports helper functions for offline use:\n\n```typescript\nimport {\n  deriveReceiptPDA,\n  deriveConfigPDA,\n  parseReceiptAccount,\n  parseRegistryConfig,\n  receiptHashToBytes,\n  normalizeReceiptHash,\n} from '@backbay/witness/fetchers/solana';\n\n// Derive PDA without network calls\nconst [receiptPda, bump] = deriveReceiptPDA(\n  '0xabcd...',\n  '5612LDBwkX4voFX4PP3mwHnrVigveTEXDxH7tAaxN5P8'\n);\n\n// Parse account data from raw bytes\nconst receiptData = parseReceiptAccount(rawAccountBytes);\nconsole.log(receiptData.status); // 'verified' | 'pending' | 'quarantined'\n```\n\n## Testing\n\nRun the test suite:\n\n```bash\ncd packages/witness\nbun install\nbun test\n```\n\nTests are fully offline - they use fixture bytes to verify parsing logic without making network calls.\n\n## Building from Source\n\n```bash\n# Build WASM\n./scripts/build-wasm.sh\n\n# Or manually:\ncd crates/cyntra-trust-wasm\nwasm-pack build --target web --release\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md","author":{"name":"Backbay","email":"dev@backbay.industries"}}