{"_id":"@btcp-io/sdk","_rev":"2-e88ce2358e720f99f2dee28669eb92a1","name":"@btcp-io/sdk","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@btcp-io/sdk","version":"0.1.0","keywords":["bsv","bitcoin-sv","mpc","wallet","threshold-ecdsa","paillier","non-custodial","multi-party-computation","evm","polygon"],"author":{"name":"BSV MPC Wallet Team"},"license":"MIT","_id":"@btcp-io/sdk@0.1.0","maintainers":[{"name":"btcp-io","email":"dev@btcpay.jp"}],"homepage":"https://github.com/anthropics/bsv-mpc-wallet-api/tree/main/sdk#readme","bugs":{"url":"https://github.com/anthropics/bsv-mpc-wallet-api/issues"},"dist":{"shasum":"049fc3831780be01e9706bb0525da3953d53c24f","tarball":"https://registry.npmjs.org/@btcp-io/sdk/-/sdk-0.1.0.tgz","fileCount":11,"integrity":"sha512-4t/5tkbvAN0B6VlZ98CjGYbhWDuie0OBv4HcJ3fRU+IjUj/PvS/xNFYmS/QP2WPwGXtRzJnVvikLRJzBt+Ik5Q==","signatures":[{"sig":"MEUCIQCeflSx1LzeLQ0GgisH9jxMzkWRD6eCCSGHEdMjxR77vwIgGA16fLlxjx6NjnkIhf7EIwQbr6aDYIlNeDP/UZTeAAw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":163498},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./wagmi":{"types":"./dist/wagmi/index.d.ts","import":"./dist/wagmi/index.mjs","require":"./dist/wagmi/index.js"}},"gitHead":"52d6aa911d275655ee2c6464c6bb82d23fe74a70","scripts":{"test":"vitest run","build":"tsup src/index.ts --format cjs,esm --dts && tsup src/wagmi/index.ts --format cjs,esm --outDir dist/wagmi","prepublishOnly":"npm run build"},"_npmUser":{"name":"btcp-io","email":"dev@btcpay.jp"},"repository":{"url":"git+https://github.com/anthropics/bsv-mpc-wallet-api.git","type":"git","directory":"sdk"},"_npmVersion":"10.9.7","description":"TypeScript SDK for the BSV MPC Wallet API — non-custodial 2-of-2 threshold ECDSA with Paillier encryption","directories":{},"_nodeVersion":"22.22.2","dependencies":{"@noble/hashes":"^1.4.0","paillier-bigint":"^3.4.0","@noble/secp256k1":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.4","typescript":"^6.0.2"},"peerDependencies":{"viem":">=2.0.0","react":">=18.0.0","@wagmi/core":">=2.0.0"},"peerDependenciesMeta":{"viem":{"optional":true},"react":{"optional":true},"@wagmi/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0_1776402489484_0.6666025922533472","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@btcp-io/sdk","version":"0.2.0","description":"TypeScript SDK for the BSV MPC Wallet API — non-custodial 2-of-2 threshold ECDSA with Paillier encryption","type":"module","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./wagmi":{"types":"./dist/wagmi/index.d.ts","import":"./dist/wagmi/index.mjs","require":"./dist/wagmi/index.js"}},"scripts":{"build":"tsup src/index.ts --format cjs,esm --dts && tsup src/wagmi/index.ts --format cjs,esm --outDir dist/wagmi","test":"vitest run","prepublishOnly":"npm run build"},"keywords":["bsv","bitcoin-sv","mpc","wallet","threshold-ecdsa","paillier","non-custodial","multi-party-computation","evm","polygon"],"author":{"name":"BSV MPC Wallet Team"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/anthropics/bsv-mpc-wallet-api.git","directory":"sdk"},"bugs":{"url":"https://github.com/anthropics/bsv-mpc-wallet-api/issues"},"homepage":"https://github.com/anthropics/bsv-mpc-wallet-api/tree/main/sdk#readme","engines":{"node":">=18.0.0"},"dependencies":{"@noble/hashes":"^1.4.0","@noble/secp256k1":"^2.0.0","paillier-bigint":"^3.4.0"},"peerDependencies":{"@wagmi/core":">=2.0.0","react":">=18.0.0","viem":">=2.0.0"},"peerDependenciesMeta":{"@wagmi/core":{"optional":true},"viem":{"optional":true},"react":{"optional":true}},"devDependencies":{"tsup":"^8.5.1","typescript":"^6.0.2","vitest":"^4.1.4"},"_id":"@btcp-io/sdk@0.2.0","gitHead":"5a5d4823e9daa7f5b1d23dcd6e2e12b4d94cc4a8","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-5hntLNIYYbpUTlwIJVvqKa5RsLbEZeRmJZSfXkdDMV6tJvEeVHsI7Xi6uEYtPx2Rw4C7bTkGQCCKrjwImxHN0A==","shasum":"bfd3a9ce21a45e0a20fe44648c51276d7549fa44","tarball":"https://registry.npmjs.org/@btcp-io/sdk/-/sdk-0.2.0.tgz","fileCount":13,"unpackedSize":170644,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDR+7QRLo36Q8OkddSBba5PqGzufI+kbL6pckp2Un+WyQIhAM8LbTHI1DW38laSHzdW6CNfX7vuTk5YaWB0ORwuKvB4"}]},"_npmUser":{"name":"btcp-io","email":"dev@btcpay.jp"},"directories":{},"maintainers":[{"name":"btcp-io","email":"dev@btcpay.jp"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.2.0_1776414689398_0.36269721157167667"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-17T05:08:09.354Z","modified":"2026-04-17T08:31:29.646Z","0.1.0":"2026-04-17T05:08:09.630Z","0.2.0":"2026-04-17T08:31:29.548Z"},"bugs":{"url":"https://github.com/anthropics/bsv-mpc-wallet-api/issues"},"author":{"name":"BSV MPC Wallet Team"},"license":"MIT","homepage":"https://github.com/anthropics/bsv-mpc-wallet-api/tree/main/sdk#readme","keywords":["bsv","bitcoin-sv","mpc","wallet","threshold-ecdsa","paillier","non-custodial","multi-party-computation","evm","polygon"],"repository":{"type":"git","url":"git+https://github.com/anthropics/bsv-mpc-wallet-api.git","directory":"sdk"},"description":"TypeScript SDK for the BSV MPC Wallet API — non-custodial 2-of-2 threshold ECDSA with Paillier encryption","maintainers":[{"name":"btcp-io","email":"dev@btcpay.jp"}],"readme":"# @bsv-mpc/sdk\n\nTypeScript SDK for **bm** — the non-custodial MPC Wallet API.\n\nClient-side key generation, threshold ECDSA signing, and wallet recovery — all without the private key ever existing in one place.\n\n## Installation\n\n```bash\nnpm install @bsv-mpc/sdk\n```\n\n```bash\nyarn add @bsv-mpc/sdk\n```\n\n```bash\npnpm add @bsv-mpc/sdk\n```\n\n**Requirements**: Node.js 18+ · Browser with Web Crypto API\n\n## Quick Start\n\n```typescript\nimport { MPCWalletClient } from '@bsv-mpc/sdk';\n\n// 1. Initialize client\nconst client = new MPCWalletClient({\n  baseUrl: 'https://api.example.com',\n});\n\n// 2. Authenticate\nawait client.auth.requestOTP('user@example.com');\nconst tokens = await client.auth.verifyOTP('user@example.com', '123456');\n// Tokens are stored automatically — subsequent requests are authenticated\n\n// 3. Create an MPC wallet (DKG Round 1)\nconst wallet = await client.wallet.create({\n  chain: 'bsv',\n  network: 'testnet',\n});\n// wallet.walletId, wallet.serverPublicShareX, wallet.paillierN, ...\n\n// 4. Complete key generation (DKG Round 2)\nconst keygen = await client.wallet.completeKeygen(wallet.walletId, {\n  clientPublicShareX: clientShare.publicShareX,\n  clientPublicShareY: clientShare.publicShareY,\n});\n\nconsole.log('Wallet address:', keygen.address);\nconsole.log('Joint public key:', keygen.jointPublicKey);\n```\n\n## Sign a BSV Transaction\n\n```typescript\nimport { clientComputePartialSignature } from '@bsv-mpc/sdk';\n\n// 1. Create an unsigned transaction\nconst tx = await client.transactions.create(walletId, {\n  inputs: [{\n    prevTxHash: 'abc123...',\n    prevTxIndex: 0,\n    prevOutputValue: 100000,\n    prevOutputScript: '76a914...',\n  }],\n  outputs: [{ address: '1BvBMSEYstWetq...', value: 50000 }],\n});\n\n// 2. Initiate MPC signing (Round 1 — server sends nonce)\nconst signInit = await client.signing.init(walletId, {\n  messageHash: tx.sighashes[0],\n  transactionHex: tx.unsignedTxHex,\n});\n\n// 3. Compute Paillier-encrypted partial signature (client-side)\nconst partialSig = clientComputePartialSignature(signInit, clientKeyShare);\n\n// 4. Complete signing (Round 2 — server produces ECDSA signature)\nconst result = await client.signing.complete(walletId, {\n  sessionId: signInit.sessionId,\n  encryptedPartialSig: partialSig.ciphertext,\n  encryptedPartialSigExponent: partialSig.exponent,\n  combinedNonceX: partialSig.combinedNonceX,\n  combinedNonceY: partialSig.combinedNonceY,\n});\n\n// 5. Broadcast\nconst broadcast = await client.transactions.broadcast(walletId, {\n  signedTxHex: result.signedTxHex,\n});\nconsole.log('txid:', broadcast.txid);\n```\n\n## EVM Transactions (Polygon)\n\n```typescript\nimport { buildEVMTransaction, serializeSignedEVMTransaction } from '@bsv-mpc/sdk';\n\n// Create wallet on Polygon Amoy testnet\nconst wallet = await client.wallet.create({ chain: 'polygon-amoy' });\n\n// Build an EVM transaction\nconst evmTx = await client.transactions.createEVM(walletId, {\n  to: '0xRecipientAddress...',\n  value: '1000000000000000000', // 1 MATIC in wei\n  gasLimit: 21000,\n});\n\n// Sign via the same MPC two-round protocol\nconst signInit = await client.signing.init(walletId, {\n  messageHash: evmTx.messageHash,\n});\n// ... complete signing flow\n```\n\n### ERC-20 Token Transfers\n\n```typescript\nimport { encodeERC20Transfer } from '@bsv-mpc/sdk';\n\nconst data = encodeERC20Transfer('0xRecipient...', 1000000n); // amount in token units\n\nconst tx = await client.transactions.createEVM(walletId, {\n  to: '0xTokenContractAddress...',\n  value: '0',\n  data,\n  gasLimit: 65000,\n});\n```\n\n## WebAuthn / Passkey\n\n```typescript\n// Register a passkey for high-value transaction signing\nconst options = await client.webauthn.registerBegin();\nconst credential = await navigator.credentials.create({ publicKey: options });\nawait client.webauthn.registerComplete(credential);\n\n// Authenticate with passkey\nconst authOptions = await client.webauthn.authenticateBegin();\nconst assertion = await navigator.credentials.get({ publicKey: authOptions });\nconst { webauthnToken } = await client.webauthn.authenticateComplete(assertion);\n\n// Use the token for policy-gated signing\nawait client.signing.init(walletId, {\n  messageHash: '...',\n  webauthnToken,\n});\n```\n\n## Wallet Recovery\n\nbm uses 2-of-3 Shamir secret sharing: server share + client share + recovery share. Any two shares can reconstruct the wallet.\n\n```typescript\n// Export recovery share — store the package offline\nconst { recoveryPackage } = await client.recovery.export(walletId, {\n  password: 'user-chosen-strong-password',\n});\n\n// Verify the backup is intact\nconst { valid } = await client.recovery.verify(walletId, {\n  recoveryPackage,\n  password: 'user-chosen-strong-password',\n});\n\n// Recover wallet after device loss\nawait client.recovery.initiate(walletId, {\n  recoveryPackage,\n  password: 'user-chosen-strong-password',\n  recoveryType: 'device_lost',\n});\n```\n\n## MFA (TOTP)\n\n```typescript\n// Setup MFA\nconst { secret, qrCodeUrl } = await client.auth.setupMFA();\n// Display QR code to user for Google Authenticator / Authy\n\n// Verify and enable MFA\nawait client.auth.verifyMFA('123456');\n\n// Subsequent logins require TOTP code\nconst tokens = await client.auth.verifyOTP('user@example.com', '123456', {\n  mfaCode: '789012',\n});\n```\n\n## Token Management\n\nThe SDK handles token refresh automatically. Provide a callback to persist tokens:\n\n```typescript\nconst client = new MPCWalletClient({\n  baseUrl: 'https://api.example.com',\n  accessToken: savedTokens.accessToken,     // restore from storage\n  refreshToken: savedTokens.refreshToken,\n  onTokenRefresh: (tokens) => {\n    // Persist new tokens when auto-refreshed\n    localStorage.setItem('tokens', JSON.stringify(tokens));\n  },\n});\n```\n\n## Wagmi Integration\n\nFor EVM dApps using wagmi/viem:\n\n```typescript\nimport { MPCConnector } from '@bsv-mpc/sdk/wagmi';\n\nconst connector = new MPCConnector({\n  baseUrl: 'https://api.example.com',\n});\n\n// Use with wagmi's createConfig\n```\n\nPeer dependencies (optional):\n- `@wagmi/core` >= 2.0.0\n- `viem` >= 2.0.0\n- `react` >= 18.0.0\n\n## Error Handling\n\n```typescript\nimport {\n  AuthenticationError,\n  PolicyViolationError,\n  PasskeyRequiredError,\n  NetworkError,\n} from '@bsv-mpc/sdk';\n\ntry {\n  await client.signing.init(walletId, { messageHash: '...' });\n} catch (error) {\n  if (error instanceof PasskeyRequiredError) {\n    // Policy requires WebAuthn — prompt user for passkey\n  } else if (error instanceof PolicyViolationError) {\n    // Spending policy violated (daily limit, velocity, etc.)\n  } else if (error instanceof AuthenticationError) {\n    // Token expired or invalid — redirect to login\n  } else if (error instanceof NetworkError) {\n    // HTTP error — check error.statusCode\n  }\n}\n```\n\n## API Reference\n\n### `MPCWalletClient`\n\nThe main entry point. All sub-clients are accessed as properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `client.auth` | `AuthClient` | OTP, JWT, MFA management |\n| `client.wallet` | `WalletClient` | Wallet creation, keygen, balance |\n| `client.signing` | `SigningClient` | MPC signing protocol |\n| `client.webauthn` | `WebAuthnClient` | Passkey registration & auth |\n| `client.recovery` | `RecoveryClient` | Backup export, verify, recover |\n\n### `AuthClient`\n\n| Method | Description |\n|--------|-------------|\n| `requestOTP(email)` | Send OTP code to email |\n| `verifyOTP(email, code, options?)` | Verify OTP, returns JWT tokens |\n| `refresh()` | Refresh access token |\n| `setupMFA()` | Get TOTP secret + QR URL |\n| `verifyMFA(code)` | Enable MFA with TOTP code |\n| `disableMFA(code)` | Disable MFA |\n| `me()` | Get current user info |\n\n### `WalletClient`\n\n| Method | Description |\n|--------|-------------|\n| `create(params)` | Create wallet (DKG Round 1) |\n| `completeKeygen(walletId, params)` | Complete keygen (DKG Round 2) |\n| `get(walletId)` | Get wallet details |\n| `getBalance(walletId)` | Get on-chain balance |\n| `getAddress(walletId)` | Get wallet address |\n\n### `SigningClient`\n\n| Method | Description |\n|--------|-------------|\n| `init(walletId, params)` | Initiate MPC signing (Round 1) |\n| `complete(walletId, params)` | Complete MPC signing (Round 2) |\n\n### `WebAuthnClient`\n\n| Method | Description |\n|--------|-------------|\n| `registerBegin()` | Get passkey registration options |\n| `registerComplete(credential)` | Complete passkey registration |\n| `authenticateBegin()` | Get passkey auth challenge |\n| `authenticateComplete(assertion)` | Authenticate, returns token |\n\n### `RecoveryClient`\n\n| Method | Description |\n|--------|-------------|\n| `export(walletId, params)` | Export encrypted recovery share |\n| `verify(walletId, params)` | Verify recovery backup integrity |\n| `initiate(walletId, params)` | Initiate wallet recovery |\n\n## TypeScript Types\n\nAll request/response types are exported:\n\n```typescript\nimport type {\n  ClientConfig,\n  TokenPair,\n  AuthTokens,\n  WalletCreateParams,\n  WalletInfo,\n  KeygenCompleteParams,\n  KeygenResult,\n  BalanceInfo,\n  SignInitResponse,\n  ClientSignData,\n  SignOptions,\n  SignatureResult,\n  WebAuthnRegisterOptions,\n  WebAuthnAuthOptions,\n  ClientShareStorage,\n  RecoveryPackage,\n  RecoveryVerifyResult,\n  RecoveryInitiateParams,\n  EVMTransferParams,\n  EVMTransactionResult,\n  BSVSendParams,\n  BSVTransactionResult,\n} from '@bsv-mpc/sdk';\n```\n\n## Crypto Utilities\n\nLow-level cryptographic utilities are also exported for advanced use:\n\n```typescript\nimport {\n  aesGcmEncrypt,\n  aesGcmDecrypt,\n  deriveKeyFromPassword,\n  hkdfDerive,\n  scryptDerive,\n  hexToBytes,\n  bytesToHex,\n  base64urlEncode,\n  base64urlDecode,\n} from '@bsv-mpc/sdk';\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}