{"_id":"@baronnotary/sdk","_rev":"2-72c919c383db1f5c22ed28e27b5832a2","name":"@baronnotary/sdk","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.0":{"name":"@baronnotary/sdk","version":"1.0.0","keywords":["solana","escrow","otc","rwa","baronnotary","settlement"],"license":"MIT","_id":"@baronnotary/sdk@1.0.0","maintainers":[{"name":"baronnotary","email":"support@baronnotary.io"}],"dist":{"shasum":"9269b7269cf614fda3b1289c9103353272d049a9","tarball":"https://registry.npmjs.org/@baronnotary/sdk/-/sdk-1.0.0.tgz","fileCount":6,"integrity":"sha512-hlUcdxiqPa9nbKbVGr+4ArRSytUn1xmcFFwTkedtSv3eIB1HeOJWWzAkCsEtnHlAmiXVrPiTzYX5lXxSUB7jKg==","signatures":[{"sig":"MEUCIHrWZpIZSXOvS3yom4j+C9Z1XUOpw2KWAZSREH0W2uiPAiEAjPfECcwxWERqegxn3wgWKtc8bhlzgCfazPpSh+8lCmE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34720},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"c3a58fb11f776f5d5b991657ef1d148844031539","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","build":"tsup src/index.ts --format cjs,esm --dts --clean","typecheck":"tsc --noEmit"},"_npmUser":{"name":"baronnotary","email":"support@baronnotary.io"},"_npmVersion":"11.6.2","description":"Official TypeScript SDK for the BaronNotary Protocol — non-custodial settlement on Solana","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.0_1785446825746_0.028315722375255703","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@baronnotary/sdk","version":"2.0.0","description":"Official TypeScript SDK for the BaronNotary Protocol — non-custodial settlement on Solana","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"}},"scripts":{"build":"tsup src/index.ts --format cjs,esm --dts --clean","dev":"tsup src/index.ts --format cjs,esm --dts --watch","typecheck":"tsc --noEmit"},"keywords":["solana","escrow","otc","rwa","baronnotary","settlement"],"license":"MIT","devDependencies":{"tsup":"^8.5.0","typescript":"^5.9.3"},"_id":"@baronnotary/sdk@2.0.0","_integrity":"sha512-zFdwFXt+UeXUqkTdufcOHF/OVVlMVu/Mcm3/Gl4ZeFVGINnOVBv9MHJrqfhsw4RRkk+7Db7jM+8jf+TnbROxKw==","_resolved":"/home/runner/workspace/lib/baron-sdk/baronnotary-sdk-2.0.0.tgz","_from":"file:baronnotary-sdk-2.0.0.tgz","_nodeVersion":"24.13.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-zFdwFXt+UeXUqkTdufcOHF/OVVlMVu/Mcm3/Gl4ZeFVGINnOVBv9MHJrqfhsw4RRkk+7Db7jM+8jf+TnbROxKw==","shasum":"1a8231c96caa9336a41a97c73a7d4a8ccf4dc37d","tarball":"https://registry.npmjs.org/@baronnotary/sdk/-/sdk-2.0.0.tgz","fileCount":6,"unpackedSize":63516,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDPn9VF5EB//qRWyMQnhMi4+DLcxk/0sadGaulfpc8ptAIgFfE6+oW/KyiH/2uR2Snwzt5XDiEPoP1X6uACHQxlGUI="}]},"_npmUser":{"name":"baronnotary","email":"support@baronnotary.io"},"directories":{},"maintainers":[{"name":"baronnotary","email":"support@baronnotary.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_2.0.0_1786485589659_0.9722331785803968"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-30T21:27:05.534Z","modified":"2026-08-11T21:59:49.919Z","1.0.0":"2026-07-30T21:27:05.884Z","2.0.0":"2026-08-11T21:59:49.783Z"},"license":"MIT","keywords":["solana","escrow","otc","rwa","baronnotary","settlement"],"description":"Official TypeScript SDK for the BaronNotary Protocol — non-custodial settlement on Solana","maintainers":[{"name":"baronnotary","email":"support@baronnotary.io"}],"readme":"# @baronnotary/sdk\n\nOfficial TypeScript SDK for the **BaronNotary Protocol** — non-custodial settlement infrastructure on Solana.\n\n## Installation\n\n```bash\nnpm install @baronnotary/sdk\n# or\npnpm add @baronnotary/sdk\n```\n\n## Quick Start\n\n```ts\nimport { BaronClient } from \"@baronnotary/sdk\";\n\n// Public endpoints — no API key needed\nconst baron = new BaronClient();\nconst order = await baron.checkout.get(\"order-id\");\n\n// Merchant endpoints — API key required\nconst client = new BaronClient({ apiKey: process.env.BARON_API_KEY });\n```\n\n## Modules\n\n### `baron.checkout` — Payments\n\n```ts\n// Create a checkout order (merchant auth required)\nconst order = await client.checkout.create({\n  tokenMint:   \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\", // USDC\n  tokenAmount: \"50\",\n  solPrice:    \"500000000\",  // 0.5 SOL in lamports (1 SOL = 1,000,000,000)\n  description: \"Order #123\",\n  redirectUrl: \"https://mystore.com/thank-you\",\n});\n\n// Redirect your customer\nwindow.location.href = order.checkoutUrl;\n\n// Poll order status (public — no auth needed)\nconst status = await baron.checkout.get(order.id);\n// status.status → \"pending\" | \"completed\" | \"cancelled\" | \"expired\"\n\n// List all orders for your merchant account\nconst orders = await client.checkout.list();\n```\n\n### `baron.merchants` — Merchant Payments\n\n```ts\n// ── v2 Registration: two-step challenge / signature flow ──────────────────────\n// Step 1: request a signable challenge message\nconst challenge = await baron.merchants.challenge(\"AbC...xyz\"); // base58 wallet pubkey\n// challenge.message — UTF-8 string to sign with the Solana wallet's Ed25519 key\n// challenge.challengeId — UUID to pass back in step 2\n// challenge.expiresAt — challenge valid for 5 minutes\n\n// Step 2: sign the message with the merchant wallet (example: using @solana/wallet-adapter)\nconst signatureBytes = await wallet.signMessage(\n  new TextEncoder().encode(challenge.message)\n);\nconst signature = bs58.encode(signatureBytes); // base58-encode the 64-byte signature\n\n// Step 3: register — returns apiKey and webhookSecret (shown exactly once)\nconst { apiKey, webhookSecret } = await baron.merchants.register({\n  challengeId: challenge.challengeId,\n  signature,\n  name: \"My Store\", // optional display name\n});\n// ⚠️  Store apiKey and webhookSecret securely — they are never shown again.\n\n// Authenticated calls (requires apiKey in BaronClient config)\nconst stats = await client.merchants.stats();\n// { totalOrders: 42, completedOrders: 40, totalVolumeSol: \"100.500000\", ... }\n\n// Set webhook URL (must be HTTPS)\nawait client.merchants.setWebhook(\"https://mystore.com/webhooks/baron\");\n```\n\n### `baron.trades` — OTC Trading\n\n```ts\n// List all public trades\nconst trades = await baron.trades.list();\n\n// Create a trade\nconst trade = await baron.trades.create({\n  sellerPubkey: \"AbC...xyz\",\n  tokenMint:    \"So11...11\",\n  tokenAmount:  1000,\n  solPrice:     1.5,\n  expiryTime:   \"2025-12-31T00:00:00Z\", // optional\n});\n\n// Update status\nawait baron.trades.update(trade.id, { status: \"completed\" });\n\n// Cancel\nawait baron.trades.cancel(trade.id);\n```\n\n### `baron.assets` — RWA Tokenization\n\n```ts\n// Create a real-world asset\nconst asset = await client.assets.create({\n  name:        \"Invoice #2025-001\",\n  assetType:   \"invoice\",\n  valueSol:    25,\n  description: \"Net-30 invoice to Acme Corp\",\n});\n\n// Mark minted on-chain\nawait client.assets.markMinted(asset.id, \"TokenMintAddress...\");\n\n// Check access\nconst { hasAccess } = await baron.assets.checkAccess(asset.id, \"WalletAddress...\");\n```\n\n### `baron.risk` — AI Risk Engine\n\n```ts\n// Analyze a counterparty wallet\nconst risk = await baron.risk.analyzeWallet(\"AbC...xyz\");\n\nif (risk.riskScore > 70) {\n  throw new Error(`High-risk wallet: ${risk.flags.join(\", \")}`);\n}\n\n// Analyze a token mint\nconst tokenRisk = await baron.risk.analyzeToken(\"TokenMint...\");\n\n// Full trade pair analysis\nconst { wallet, token } = await baron.risk.analyzeTrade({\n  walletAddress: \"AbC...xyz\",\n  tokenMint:     \"TokenMint...\",\n});\n```\n\n## Configuration\n\n```ts\nconst baron = new BaronClient({\n  apiKey:  process.env.BARON_API_KEY,        // optional — required for merchant endpoints\n  baseUrl: \"https://baronnotary.io/api\",     // optional — override for self-hosted\n});\n```\n\n## Webhook Verification\n\nVerify incoming webhook signatures to ensure authenticity:\n\n```ts\nimport { createHmac, timingSafeEqual } from \"crypto\";\nimport express from \"express\";\n\nconst app = express();\n\n// IMPORTANT: Use raw body buffer — do NOT use express.json() before this route\napp.post(\"/webhooks/baron\", express.raw({ type: \"application/json\" }), (req, res) => {\n  const signature = req.headers[\"x-baronnotary-signature\"] as string;\n  const timestamp  = req.headers[\"x-baronnotary-timestamp\"] as string;\n  const rawBody    = req.body.toString(\"utf8\");\n\n  // Reject stale requests (older than 5 minutes)\n  if (!timestamp || Date.now() - Number(timestamp) > 300_000) {\n    res.status(401).json({ error: \"Request too old\" });\n    return;\n  }\n\n  // Compute expected signature\n  const expected = createHmac(\"sha256\", process.env.BARON_WEBHOOK_SECRET!)\n    .update(`${timestamp}.${rawBody}`)\n    .digest(\"hex\");\n\n  // Timing-safe comparison\n  const a = Buffer.from(expected, \"hex\");\n  const b = Buffer.from(signature ?? \"\", \"hex\");\n  if (a.length !== b.length || !timingSafeEqual(a, b)) {\n    res.status(401).json({ error: \"Invalid signature\" });\n    return;\n  }\n\n  const event = JSON.parse(rawBody);\n\n  // Use eventId for idempotency\n  if (await alreadyProcessed(event.eventId)) {\n    res.sendStatus(200);\n    return;\n  }\n\n  if (event.event === \"checkout.completed\") {\n    const { orderId, tokenAmount, tradeId } = event.data;\n    // fulfil order ...\n  }\n\n  if (event.event === \"checkout.cancelled\") {\n    const { orderId } = event.data;\n    // cancel order ...\n  }\n\n  res.sendStatus(200);\n});\n```\n\n## Error Handling\n\n```ts\ntry {\n  const order = await baron.checkout.get(\"non-existent-id\");\n} catch (err) {\n  // err.message → \"[baron-sdk] 404 Order not found\"\n}\n```\n\n## License\n\nMIT © BaronNotary Protocol\n","readmeFilename":"README.md"}