{"_id":"@ahpb21/brilliant-test","name":"@ahpb21/brilliant-test","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"@ahpb21/brilliant-test","version":"0.2.0","description":"JavaScript/TypeScript SDK for BrilliantHash blockchain","type":"module","main":"dist/src/index.js","types":"dist/src/index.d.ts","exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js"},"./package.json":"./package.json"},"publishConfig":{"access":"public"},"scripts":{"build":"tsc -p tsconfig.json","test":"node ./tests/run.js","smoke":"node dist\\examples\\smoke.js","rpc-smoke":"node dist\\examples\\rpc-smoke.js","transfer-smoke":"node dist\\examples\\transfer-smoke.js","deploy-smoke":"node dist\\examples\\deploy-contract.js","call-smoke":"node dist\\examples\\contract-call-smoke.js","send-native-smoke":"node dist\\examples\\call_send_native.js"},"dependencies":{"@noble/ed25519":"^2.0.0","@noble/hashes":"^1.4.0","eventsource":"^4.0.0","isomorphic-fetch":"^3.0.0"},"devDependencies":{"@types/node":"^24.10.0","typescript":"^5.5.4"},"_id":"@ahpb21/brilliant-test@0.2.0","_nodeVersion":"22.18.0","_npmVersion":"11.5.2","dist":{"integrity":"sha512-7efXyWwYVuqp6ftZ9oqEoBudw70/G01CqJd2ynNYvGSbtCKv2InukgA/Ayq+WAlEKwKyWOXvG5GT503JoHejSA==","shasum":"64ea4f805660f95900d91943097b16e26fcbca07","tarball":"https://registry.npmjs.org/@ahpb21/brilliant-test/-/brilliant-test-0.2.0.tgz","fileCount":42,"unpackedSize":52559,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCnTBcyDjoV7sXtJxn9LDCxm0fDIP9VEBiggiQQIMBQ9AIhAP6n3xIi6/AbiQ3I4ZZXgCEOfQYq14aeOYBgEfcp+be9"}]},"_npmUser":{"name":"ahpb21","email":"ahpb21@gmail.com"},"directories":{},"maintainers":[{"name":"ahpb21","email":"ahpb21@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/brilliant-test_0.2.0_1766311021903_0.7044422532057961"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-21T09:57:01.807Z","0.2.0":"2025-12-21T09:57:02.059Z","modified":"2025-12-21T09:57:02.358Z"},"maintainers":[{"name":"ahpb21","email":"ahpb21@gmail.com"}],"description":"JavaScript/TypeScript SDK for BrilliantHash blockchain","readme":"# BrilliantHash JavaScript SDK\r\n\r\nJavaScript/TypeScript SDK for BrilliantHash blockchain。支持构建与签名交易、RPC 调用、浏览器数据订阅以及示例合约的只读调用。\r\n\r\n## 功能概览\r\n- 钱包：生成地址、公钥、私钥；签名消息哈希；Keystore 导入/导出\r\n- 交易：交易构建与签名（后端生成消息哈希），RPC 发送交易\r\n- 网络：HTTP 传输（自动 BigInt→number 序列化），事件订阅（Node 环境自动采用 `eventsource` polyfill 或轮询回退）\r\n- 查询：最新区块高度、按高度/哈希查询区块、账户信息、Explorer 统计与分页\r\n- 合约：部署合约（读取仓库中的 Wasm 文件）、只读调用合约（calldata 为 4 字节选择器 + bincode 参数）\r\n\r\n## 环境要求\r\n- Node.js ≥ 18、npm\r\n- TypeScript ≥ 5（项目已内置）\r\n\r\n## 安装与构建\r\n- 安装依赖\r\n```bash\r\nnpm install\r\n```\r\n- 构建\r\n```bash\r\nnpm run build\r\n```\r\n\r\n## 快速开始\r\n- 通过 SDK 创建钱包并打印地址、公钥、私钥（示例参考 `examples/smoke.ts`）：\r\n```ts\r\nimport { Wallet } from \"./src/index.js\";\r\n\r\nconst wallet = await Wallet.create();\r\nconsole.log(\"address:\", wallet.addressHex());\r\nconsole.log(\"publicKey:\", wallet.publicKeyHex());\r\nconsole.log(\"privateKey:\", wallet.privateKeyHex()); // 请勿在生产日志输出\r\n```\r\n\r\n- 进行简单 RPC 调用（示例参考 `examples/rpc-smoke.ts`）：\r\n```ts\r\nimport { HttpTransport, Client } from \"./src/index.js\";\r\n\r\nconst transport = new HttpTransport([\"http://127.0.0.1:1111\"]);\r\nconst client = new Client(transport);\r\nconst height = await client.getLatestBlockHeight();\r\nconsole.log(\"Latest height:\", height);\r\n```\r\n\r\n## 示例与运行脚本\r\n本仓库已提供多个示例（位于 `js-sdk/examples`），编译后可通过 npm 脚本运行：\r\n- 构建\r\n```bash\r\nnpm run build\r\n```\r\n- 基本钱包/加解密/Keystore 冒烟\r\n```bash\r\nnpm run smoke\r\n```\r\n- RPC 冒烟（Explorer 统计、最新高度等）\r\n```bash\r\nnpm run rpc-smoke\r\n```\r\n- 转账冒烟\r\n```bash\r\nnpm run transfer-smoke\r\n```\r\n- 部署合约（读取仓库根的 `target/wasm32-unknown-unknown/release/output_example.wasm`）\r\n```bash\r\nnpm run deploy-smoke\r\n```\r\n- 只读调用合约（调用 `who_am_i()`）\r\n```bash\r\nnpm run call-smoke\r\n```\r\n\r\n### 只读调用合约（who_am_i）\r\n- 运行前需设置环境变量 `CONTRACT_ADDRESS`（合约部署成功后得到的地址）。注意 PowerShell 与 cmd 的写法不同：\r\n\r\nPowerShell：\r\n```bash\r\n$env:CONTRACT_ADDRESS=\"0xb051a819b9888637ebb6278a21e031e864b0558fce39d6148feccfa2a3087e88\"\r\n```\r\n然后运行：\r\n```bash\r\nnpm run call-smoke\r\n```\r\n\r\ncmd（命令提示符）：\r\n```bash\r\nset CONTRACT_ADDRESS=0xb051a819b9888637ebb6278a21e031e864b0558fce39d6148feccfa2a3087e88\r\n```\r\n然后运行：\r\n```bash\r\nnpm run call-smoke\r\n```\r\n\r\n- 可选：指定私钥（默认使用仓库中的创世私钥）\r\nPowerShell：\r\n```bash\r\n$env:PRIVATE_KEY_HEX=\"0xc31a2f259866b056c34e1243b4e99bb941bce6216e14198cb0960626f316eab5\"\r\n```\r\ncmd：\r\n```bash\r\nset PRIVATE_KEY_HEX=0xc31a2f259866b056c34e1243b4e99bb941bce6216e14198cb0960626f316eab5\r\n```\r\n\r\n- 返回值说明：`call_contract` 返回 Wasm 执行结果的原始字节，封装为十六进制字符串（`0x...`）。对 `who_am_i()`，返回的是 `(Address, Address)` 的 bincode 编码，所以你会看到两段“长度前缀 u64 LE（32字节） + 32字节地址”。示例已附带解码函数，将打印调用者地址与合约自身地址。\r\n\r\n## 事务发送与结构约定\r\n- `Client.sendTransaction(tx: RpcTransaction)` 会自动完成与后端的结构对齐：\r\n  - `publicKey`、`signature`：自动移除 `0x` 前缀\r\n  - `nonce`、`fee`、所有金额类字段：自动从 BigInt 转换为 number（由 HTTP 传输层统一处理）\r\n  - `deployContract.code` 与 `callContract.data`：自动移除 `0x` 前缀，符合后端的 `String` 入参解码策略\r\n- 你可以直接构建 `RpcTransaction` 并调用 `client.sendTransaction(tx)`；或使用 `TransactionBuilder` 请求后端生成消息哈希并本地签名：\r\n```ts\r\nimport { HttpTransport, Client, TransactionBuilder, Wallet } from \"./src/index.js\";\r\n\r\nconst transport = new HttpTransport([\"http://127.0.0.1:1111\"]);\r\nconst client = new Client(transport);\r\nconst wallet = await Wallet.create();\r\n\r\nconst builder = new TransactionBuilder()\r\n  .setData({ type: \"transfer\", to: \"0x<recipient>\", amount: 1000n })\r\n  .setNonce(1n)\r\n  .setFee(5000n);\r\n\r\nconst tx = await builder.signAndBuild(\r\n  transport,\r\n  wallet.publicKeyHex(),\r\n  (msgHex) => wallet.signMessageHash(msgHex)\r\n);\r\n\r\nawait client.sendTransaction(tx);\r\n```\r\n\r\n## 合约部署与只读调用\r\n- 部署示例 `deploy-contract.ts` 会读取 `../target/wasm32-unknown-unknown/release/output_example.wasm` 并发送 `deployContract` 交易；请确保你已用 Rust 环境构建出该 Wasm。\r\n- 只读调用示例 `contract-call-smoke.ts` 使用极简 ABI 编码器生成 4 字节选择器（与以太风格一致），参数采用 bincode 编码，最终拼装为 `calldata`；示例包含 `who_am_i()` 的解码逻辑。\r\n\r\n## Explorer 事件订阅（SSE）\r\n- 浏览器环境：使用原生 `EventSource`\r\n- Node 环境：\r\n  - 优先动态加载 `eventsource` polyfill（已在 `dependencies` 中）\r\n  - 加载失败时自动回退为每秒轮询 `/explorer/stats`，并以统一事件格式回调\r\n- 该机制内置于 `HttpTransport.subscribeSse(path, onMessage)`。示例文件 `examples/explorer-stream.ts` 展示了使用方式。\r\n\r\n## 安全注意事项\r\n- 切勿在生产日志打印私钥或敏感数据（示例仅用于本地验证）\r\n- 示例使用默认创世账户私钥，实际生产请自行管理密钥并进行权限控制\r\n\r\n## 已知约束\r\n- 只读调用返回的是原始字节的十六进制字符串；具体含义需依据合约的返回类型进行 bincode 解码（示例已提供 `who_am_i()` 的解码）。\r\n- `AddressHex`、交易字段约定均使用小写十六进制，地址为 32 字节（`0x` 前缀）。","readmeFilename":"README.md","_rev":"1-5c69ab8cd89dbb7ee4cabe2c5b2bf08a"}