{"_id":"@claritydao/midnight-sdk","_rev":"5-65c9502254d4280592ff1c9cf7088167","name":"@claritydao/midnight-sdk","dist-tags":{"latest":"1.1.3"},"versions":{"0.1.0":{"name":"@claritydao/midnight-sdk","version":"0.1.0","_id":"@claritydao/midnight-sdk@0.1.0","maintainers":[{"name":"justinschreiner","email":"justin@clearcontracts.io"},{"name":"mikekeke","email":"mikhail@mlabs.city"},{"name":"t4ccer","email":"t4ccer@gmail.com"},{"name":"goldie-laux","email":"mlaux6@outlook.com"},{"name":"rmgaray","email":"ramiro@mlabs.city"}],"dist":{"shasum":"ab5873022255d4d3ed7cc4e1887058bfb63a5578","tarball":"https://registry.npmjs.org/@claritydao/midnight-sdk/-/midnight-sdk-0.1.0.tgz","fileCount":21,"integrity":"sha512-CO12Emd04lQxT5k51UFJAXxZ6Oa3mRKjICyi/4K8IRT4GolF109cF4Zjb1VLieNUw6rEUixve6FmWE34cSQmFQ==","signatures":[{"sig":"MEUCIQCtDK5hYu4j8lP9RkoW+DXq+iZhjhvD8QBPM6iNlzDbbwIgLy80b3Fq2WN3iFCQoS0pLWFhOzP/59glkgPZ+xyY94c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149508},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"2b5a6f135587cd4f5b4f983b67e9eb06e66a20d3","scripts":{"dev":"tsc --watch","lint":"eslint src","test":"vitest","build":"tsc"},"_npmUser":{"name":"justinschreiner","email":"justin@clearcontracts.io"},"_npmVersion":"10.9.0","description":"Production-ready TypeScript SDK for governance operations on the Midnight blockchain.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"rxjs":"^7.8.2","fp-ts":"^2.16.11","semver":"^7.7.3","@midnight-ntwrk/zswap":"^4.0.0","@midnight-ntwrk/ledger":"^4.0.0","@midnight-ntwrk/compact-runtime":"^0.8.1","@midnight-ntwrk/midnight-js-types":"^2.0.2","@midnight-ntwrk/midnight-js-utils":"^2.0.2","@midnight-ntwrk/dapp-connector-api":"^3.0.0","@claritydao/midnight-agora-contracts":"workspace:*","@midnight-ntwrk/midnight-js-contracts":"^2.0.2","@midnight-ntwrk/midnight-js-network-id":"^2.0.2","@midnight-ntwrk/wallet-sdk-address-format":"^2.0.0","@midnight-ntwrk/midnight-js-fetch-zk-config-provider":"^2.0.2","@midnight-ntwrk/midnight-js-http-client-proof-provider":"^2.0.2","@midnight-ntwrk/midnight-js-indexer-public-data-provider":"^2.0.2","@midnight-ntwrk/midnight-js-level-private-state-provider":"^2.0.2"},"_hasShrinkwrap":false,"devDependencies":{"pino":"^9.14.0","vitest":"^3.2.4","typescript":"^5.7.2","@types/node":"^22.10.2","@types/semver":"^7.7.1"},"_npmOperationalInternal":{"tmp":"tmp/midnight-sdk_0.1.0_1768323719746_0.5191007266714953","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@claritydao/midnight-sdk","version":"1.1.0","_id":"@claritydao/midnight-sdk@1.1.0","maintainers":[{"name":"justinschreiner","email":"justin@clearcontracts.io"},{"name":"mikekeke","email":"mikhail@mlabs.city"},{"name":"t4ccer","email":"t4ccer@gmail.com"},{"name":"goldie-laux","email":"mlaux6@outlook.com"},{"name":"rmgaray","email":"ramiro@mlabs.city"}],"dist":{"shasum":"a2af32c1f2180a008e7f21998b0205a5dfed5492","tarball":"https://registry.npmjs.org/@claritydao/midnight-sdk/-/midnight-sdk-1.1.0.tgz","fileCount":21,"integrity":"sha512-zdWHDSo9Tl/C0mLU6gBmHSkO+DDmIhYJx0t3ZAlv5+fAfl4NeNoV1MQ+Gjf9REArs37nqmQ9uyNQcbJEKvLWng==","signatures":[{"sig":"MEUCIQCU72u7JPV1bsmrWGHUUsohvVvYmi547QXsxKgNcIYucwIgM+U0GhVsxfRL1UQQ3U3/+mQc3UmgD/ic7zQxK/nnVtI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149497},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"2b5a6f135587cd4f5b4f983b67e9eb06e66a20d3","scripts":{"dev":"tsc --watch","lint":"eslint src","test":"vitest","build":"tsc"},"_npmUser":{"name":"justinschreiner","email":"justin@clearcontracts.io"},"_npmVersion":"10.9.0","description":"Production-ready TypeScript SDK for governance operations on the Midnight blockchain.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"rxjs":"^7.8.2","fp-ts":"^2.16.11","semver":"^7.7.3","@midnight-ntwrk/zswap":"^4.0.0","@midnight-ntwrk/ledger":"^4.0.0","@midnight-ntwrk/compact-runtime":"^0.8.1","@midnight-ntwrk/midnight-js-types":"^2.0.2","@midnight-ntwrk/midnight-js-utils":"^2.0.2","@midnight-ntwrk/dapp-connector-api":"^3.0.0","@claritydao/midnight-agora-contracts":"*","@midnight-ntwrk/midnight-js-contracts":"^2.0.2","@midnight-ntwrk/midnight-js-network-id":"^2.0.2","@midnight-ntwrk/wallet-sdk-address-format":"^2.0.0","@midnight-ntwrk/midnight-js-fetch-zk-config-provider":"2.0.2","@midnight-ntwrk/midnight-js-http-client-proof-provider":"^2.0.2","@midnight-ntwrk/midnight-js-indexer-public-data-provider":"^2.0.2","@midnight-ntwrk/midnight-js-level-private-state-provider":"^2.0.2"},"_hasShrinkwrap":false,"devDependencies":{"pino":"^9.14.0","vitest":"^3.2.4","typescript":"^5.7.2","@types/node":"^22.10.2","@types/semver":"^7.7.1"},"_npmOperationalInternal":{"tmp":"tmp/midnight-sdk_1.1.0_1768341691293_0.1393679529997205","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@claritydao/midnight-sdk","version":"1.1.1","_id":"@claritydao/midnight-sdk@1.1.1","maintainers":[{"name":"justinschreiner","email":"justin@clearcontracts.io"},{"name":"mikekeke","email":"mikhail@mlabs.city"},{"name":"t4ccer","email":"t4ccer@gmail.com"},{"name":"goldie-laux","email":"mlaux6@outlook.com"},{"name":"rmgaray","email":"ramiro@mlabs.city"}],"dist":{"shasum":"497dbacc73c86cfd6dc9269a3c2acfd616280ff5","tarball":"https://registry.npmjs.org/@claritydao/midnight-sdk/-/midnight-sdk-1.1.1.tgz","fileCount":38,"integrity":"sha512-Vm8GXgNFLoYj645gBSsmhJE0sABgdm2EFynSEI3imK8bRdaDQpZSqGWxEArjBSyEZ0n3uB3HTuL1wNDnfeLa1A==","signatures":[{"sig":"MEQCIG7Lbo6jaqhrd+r4DXfzFdFRcO+7xmcSJw5+I2+sf/OMAiAYefKquNU+zVEexmx28Sj9O0tW8699RR8F201eJyOMbw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161324},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"2b5a6f135587cd4f5b4f983b67e9eb06e66a20d3","scripts":{"dev":"tsc --watch","lint":"eslint src","test":"vitest","build":"tsc"},"_npmUser":{"name":"justinschreiner","email":"justin@clearcontracts.io"},"_npmVersion":"10.9.0","description":"Production-ready TypeScript SDK for governance operations on the Midnight blockchain.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"rxjs":"^7.8.2","fp-ts":"^2.16.11","semver":"^7.7.3","@midnight-ntwrk/zswap":"^4.0.0","@midnight-ntwrk/ledger":"^4.0.0","@midnight-ntwrk/compact-runtime":"^0.8.1","@midnight-ntwrk/midnight-js-types":"^2.0.2","@midnight-ntwrk/midnight-js-utils":"^2.0.2","@midnight-ntwrk/dapp-connector-api":"^3.0.0","@claritydao/midnight-agora-contracts":"*","@midnight-ntwrk/midnight-js-contracts":"^2.0.2","@midnight-ntwrk/midnight-js-network-id":"^2.0.2","@midnight-ntwrk/wallet-sdk-address-format":"^2.0.0","@midnight-ntwrk/midnight-js-fetch-zk-config-provider":"2.0.2","@midnight-ntwrk/midnight-js-http-client-proof-provider":"^2.0.2","@midnight-ntwrk/midnight-js-indexer-public-data-provider":"^2.0.2","@midnight-ntwrk/midnight-js-level-private-state-provider":"^2.0.2"},"_hasShrinkwrap":false,"devDependencies":{"pino":"^9.14.0","vitest":"^3.2.4","typescript":"^5.7.2","@types/node":"^22.10.2","@types/semver":"^7.7.1"},"_npmOperationalInternal":{"tmp":"tmp/midnight-sdk_1.1.1_1768341999043_0.2361041525651375","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@claritydao/midnight-sdk","version":"1.1.2","_id":"@claritydao/midnight-sdk@1.1.2","maintainers":[{"name":"justinschreiner","email":"justin@clearcontracts.io"},{"name":"mikekeke","email":"mikhail@mlabs.city"},{"name":"t4ccer","email":"t4ccer@gmail.com"},{"name":"goldie-laux","email":"mlaux6@outlook.com"},{"name":"rmgaray","email":"ramiro@mlabs.city"}],"dist":{"shasum":"0067386002de8f3a9b53b8be2d4f3c258b2877c8","tarball":"https://registry.npmjs.org/@claritydao/midnight-sdk/-/midnight-sdk-1.1.2.tgz","fileCount":38,"integrity":"sha512-PMCllvJPfU81M/ZFe3FYBM3Y9N9sxzLSNZmbJMc/IJChhR2jNDgQFmCpTSzvlKFCsnYmdBa3WFcQU4588UXz6Q==","signatures":[{"sig":"MEUCICwetIdlvjmumpSHoEfH8zsQDIBLK2wSqdLzmeMn/pYWAiEAqf0dTfrHhPVGKqmu2tgsLum+2/pvybt6MSs+ZaB30BA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161324},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"2b5a6f135587cd4f5b4f983b67e9eb06e66a20d3","scripts":{"dev":"tsc --watch","lint":"eslint src","test":"vitest","build":"tsc"},"_npmUser":{"name":"justinschreiner","email":"justin@clearcontracts.io"},"_npmVersion":"10.9.0","description":"Production-ready TypeScript SDK for governance operations on the Midnight blockchain.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"rxjs":"^7.8.2","fp-ts":"^2.16.11","semver":"^7.7.3","@midnight-ntwrk/zswap":"^4.0.0","@midnight-ntwrk/ledger":"^4.0.0","@midnight-ntwrk/compact-runtime":"^0.9.0","@midnight-ntwrk/midnight-js-types":"^2.0.2","@midnight-ntwrk/midnight-js-utils":"^2.0.2","@midnight-ntwrk/dapp-connector-api":"^3.0.0","@claritydao/midnight-agora-contracts":"*","@midnight-ntwrk/midnight-js-contracts":"^2.0.2","@midnight-ntwrk/midnight-js-network-id":"^2.0.2","@midnight-ntwrk/wallet-sdk-address-format":"^2.0.0","@midnight-ntwrk/midnight-js-fetch-zk-config-provider":"2.0.2","@midnight-ntwrk/midnight-js-http-client-proof-provider":"^2.0.2","@midnight-ntwrk/midnight-js-indexer-public-data-provider":"^2.0.2","@midnight-ntwrk/midnight-js-level-private-state-provider":"^2.0.2"},"_hasShrinkwrap":false,"devDependencies":{"pino":"^9.14.0","vitest":"^3.2.4","typescript":"^5.7.2","@types/node":"^22.10.2","@types/semver":"^7.7.1"},"_npmOperationalInternal":{"tmp":"tmp/midnight-sdk_1.1.2_1768343227663_0.06679514833454747","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@claritydao/midnight-sdk","version":"1.1.3","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"build":"tsc","dev":"tsc --watch","test":"vitest","lint":"eslint src"},"dependencies":{"@claritydao/midnight-agora-contracts":"*","@midnight-ntwrk/compact-runtime":"^0.9.0","@midnight-ntwrk/dapp-connector-api":"^3.0.0","@midnight-ntwrk/ledger":"^4.0.0","@midnight-ntwrk/midnight-js-contracts":"^2.0.2","@midnight-ntwrk/midnight-js-fetch-zk-config-provider":"2.0.2","@midnight-ntwrk/midnight-js-http-client-proof-provider":"^2.0.2","@midnight-ntwrk/midnight-js-indexer-public-data-provider":"^2.0.2","@midnight-ntwrk/midnight-js-level-private-state-provider":"^2.0.2","@midnight-ntwrk/midnight-js-network-id":"^2.0.2","@midnight-ntwrk/midnight-js-types":"^2.0.2","@midnight-ntwrk/midnight-js-utils":"^2.0.2","@midnight-ntwrk/wallet-sdk-address-format":"^2.0.0","@midnight-ntwrk/zswap":"^4.0.0","fp-ts":"^2.16.11","rxjs":"^7.8.2","semver":"^7.7.3"},"devDependencies":{"@types/node":"^22.10.2","@types/semver":"^7.7.1","pino":"^9.14.0","typescript":"^5.7.2","vitest":"^3.2.4"},"_id":"@claritydao/midnight-sdk@1.1.3","gitHead":"2b5a6f135587cd4f5b4f983b67e9eb06e66a20d3","description":"Production-ready TypeScript SDK for governance operations on the Midnight blockchain.","_nodeVersion":"23.3.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-xezeRk4FgRRNO+5MrC7GZu4YtVP7XbTvg/FlcFM2H1kdiedwBg2G6Wg5QZUwe9DuNhXi3UKxpGMdcsnA4w3A9w==","shasum":"23752e0ecb5120c7634b07f37f6e916126e3547d","tarball":"https://registry.npmjs.org/@claritydao/midnight-sdk/-/midnight-sdk-1.1.3.tgz","fileCount":38,"unpackedSize":161357,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC1ht6jbAHKUPjzUVRgj33P/TnvQTgB/Og3luJSVTdsDwIgM/iRRdgCkMOydPpa1pmT+doiwWOQ5IbBFrh7clKxefI="}]},"_npmUser":{"name":"justinschreiner","email":"justin@clearcontracts.io"},"directories":{},"maintainers":[{"name":"justinschreiner","email":"justin@clearcontracts.io"},{"name":"mikekeke","email":"mikhail@mlabs.city"},{"name":"t4ccer","email":"t4ccer@gmail.com"},{"name":"goldie-laux","email":"mlaux6@outlook.com"},{"name":"rmgaray","email":"ramiro@mlabs.city"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/midnight-sdk_1.1.3_1768343614246_0.9674893845266481"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-13T17:01:59.685Z","modified":"2026-01-13T22:33:34.655Z","0.1.0":"2026-01-13T17:01:59.901Z","1.1.0":"2026-01-13T22:01:31.479Z","1.1.1":"2026-01-13T22:06:39.190Z","1.1.2":"2026-01-13T22:27:07.815Z","1.1.3":"2026-01-13T22:33:34.429Z"},"description":"Production-ready TypeScript SDK for governance operations on the Midnight blockchain.","maintainers":[{"name":"justinschreiner","email":"justin@clearcontracts.io"},{"name":"mikekeke","email":"mikhail@mlabs.city"},{"name":"t4ccer","email":"t4ccer@gmail.com"},{"name":"goldie-laux","email":"mlaux6@outlook.com"},{"name":"rmgaray","email":"ramiro@mlabs.city"}],"readme":"# Agora DAO Midnight SDK\n\nProduction-ready TypeScript SDK for governance operations on the Midnight blockchain.\n\n## Overview\n\nThe Agora DAO Midnight SDK provides a type-safe, professional-grade interface for interacting with governance contracts on Midnight Network. It integrates with the Lace wallet extension and provides comprehensive APIs for DAO governance operations.\n\n## Features\n\n- **Type-Safe**: Full TypeScript support with comprehensive type definitions\n- **Production-Ready**: No hardcoded values, proper error handling, validation\n- **Browser-Native**: Works directly in modern browsers with Lace wallet\n- **Observable State**: Reactive patterns with RxJS for real-time updates\n- **Zero-Knowledge**: Privacy-preserving governance with ZK proofs\n- **Well-Documented**: Complete API reference and examples\n\n## Installation\n\n```bash\npnpm add @claritydao/midnight-sdk\n```\n\n## Quick Start\n\n### 1. Deploy a New Governor Contract\n\n```typescript\nimport {\n  GovernorAPI,\n  initializeProviders,\n  ConfigPresets,\n} from \"@claritydao/midnight-sdk\";\nimport { randomBytes } from \"@midnight-ntwrk/midnight-js-utils\";\nimport pino from \"pino\";\n\nconst logger = pino({ level: \"info\" });\n\n// Initialize providers (connects to Lace wallet)\nconst providers = await initializeProviders(logger);\n\n// Create deployment configuration\nconst config = {\n  governor: {\n    governance: ConfigPresets.testing(), // or ConfigPresets.production()\n    executionDelay: BigInt(60),\n    gracePeriod: BigInt(300),\n    maxActiveProposals: BigInt(100),\n    proposalLifetime: BigInt(86400),\n    emergencyVetoEnabled: true,\n    emergencyVetoThreshold: BigInt(75000),\n  },\n  token: {\n    name: \"My DAO Token\",\n    symbol: \"MDAO\",\n    decimals: BigInt(18),\n  },\n  adminKey: randomBytes(32), // IMPORTANT: Use secure random bytes!\n};\n\n// Deploy contract\nconst api = await GovernorAPI.deploy(providers, config, logger);\nconsole.log(\"Contract deployed at:\", api.deployedContractAddress);\n```\n\n### 2. Join an Existing Contract\n\n```typescript\nimport { GovernorAPI, initializeProviders } from \"@claritydao/midnight-sdk\";\nimport pino from \"pino\";\n\nconst logger = pino({ level: \"info\" });\nconst providers = await initializeProviders(logger);\n\n// Join existing contract\nconst contractAddress = \"existing-contract-address\";\nconst api = await GovernorAPI.join(providers, contractAddress, logger);\n```\n\n### 3. Create a Proposal\n\n```typescript\nimport { VoteChoice } from \"@claritydao/midnight-sdk\";\nimport type { ProposalAction } from \"@claritydao/midnight-sdk\";\n\n// Define proposal actions (what happens if proposal passes)\nconst actions: ProposalAction[] = [\n  {\n    typ: 0, // Transfer type\n    token: tokenAddress,\n    amount: BigInt(10000),\n    to: recipientAddress,\n    configKey: new Uint8Array(32),\n    configValue: new Uint8Array(32),\n  },\n];\n\n// Create proposal (requires sufficient stake)\nconst { txData, proposalId } = await api.createProposal(\n  \"Fund Community Initiative\",\n  \"Transfer 10,000 tokens to community wallet for Q1 initiatives\",\n  creatorAddress,\n  actions\n);\n\nconsole.log(\"Proposal created with ID:\", proposalId);\n```\n\n### 4. Cast a Vote\n\n```typescript\nimport { VoteChoice } from \"@claritydao/midnight-sdk\";\n\n// Vote on proposal (type-safe!)\nawait api.castVote(\n  proposalId,\n  voterAddress,\n  VoteChoice.For // VoteChoice.Against or VoteChoice.Abstain\n);\n\nconsole.log(\"Vote cast successfully\");\n```\n\n## Configuration Presets\n\nThe SDK provides two configuration presets:\n\n### Testing Configuration\n\nFor development and testnet:\n\n```typescript\nimport { ConfigPresets } from \"@claritydao/midnight-sdk\";\n\nconst governanceConfig = ConfigPresets.testing();\n// Returns:\n// {\n//   votingPeriod: BigInt(300),        // 5 minutes\n//   quorumThreshold: BigInt(100),     // 100 tokens\n//   proposalThreshold: BigInt(50),    // 50 tokens to create proposals\n//   proposalLifetime: BigInt(3600),   // 1 hour\n//   executionDelay: BigInt(60),       // 1 minute\n//   gracePeriod: BigInt(300),         // 5 minutes\n//   minStakeAmount: BigInt(10),       // 10 tokens minimum\n//   stakingPeriod: BigInt(60),        // 1 minute lock\n// }\n```\n\n### Production Configuration\n\nFor mainnet:\n\n```typescript\nimport { ConfigPresets } from \"@claritydao/midnight-sdk\";\n\nconst governanceConfig = ConfigPresets.production();\n// Returns:\n// {\n//   votingPeriod: BigInt(604800),     // 7 days\n//   quorumThreshold: BigInt(100000),  // 100K tokens\n//   proposalThreshold: BigInt(50000), // 50K tokens to create proposals\n//   proposalLifetime: BigInt(1209600), // 14 days\n//   executionDelay: BigInt(86400),    // 24 hours\n//   gracePeriod: BigInt(259200),      // 3 days\n//   minStakeAmount: BigInt(1000),     // 1K tokens minimum\n//   stakingPeriod: BigInt(604800),    // 7 days lock\n// }\n```\n\n## API Reference\n\n### Types\n\n#### DeploymentConfig\n\nComplete deployment configuration:\n\n```typescript\ninterface DeploymentConfig {\n  governor: GovernorConfig;\n  token: TokenConfig;\n  adminKey: Uint8Array; // 32 bytes - use randomBytes(32)\n}\n```\n\n#### GovernorConfig\n\nGovernor contract parameters:\n\n```typescript\ninterface GovernorConfig {\n  governance: GovernanceConfig;\n  executionDelay: bigint;\n  gracePeriod: bigint;\n  maxActiveProposals: bigint;\n  proposalLifetime: bigint;\n  emergencyVetoEnabled: boolean;\n  emergencyVetoThreshold: bigint;\n}\n```\n\n#### GovernanceConfig\n\nCore governance parameters:\n\n```typescript\ninterface GovernanceConfig {\n  votingPeriod: bigint; // How long voting lasts\n  quorumThreshold: bigint; // Minimum votes to pass\n  proposalThreshold: bigint; // Stake required to create proposals\n  proposalLifetime: bigint; // How long proposals remain valid\n  executionDelay: bigint; // Time-lock before execution\n  gracePeriod: bigint; // Window to execute after delay\n  minStakeAmount: bigint; // Minimum stake to vote\n  stakingPeriod: bigint; // Stake lock duration\n}\n```\n\n#### TokenConfig\n\nToken parameters:\n\n```typescript\ninterface TokenConfig {\n  name: string; // Max 64 characters\n  symbol: string; // Max 16 characters\n  decimals: bigint; // Max 18\n}\n```\n\n#### ProposalAction\n\nActions to execute when proposal passes:\n\n```typescript\ninterface ProposalAction {\n  typ: number; // Action type (0 = transfer)\n  token: Uint8Array; // Token address (32 bytes)\n  amount: bigint; // Amount to transfer\n  to: Uint8Array; // Recipient address (32 bytes)\n  configKey: Uint8Array; // Config key (32 bytes)\n  configValue: Uint8Array; // Config value (32 bytes)\n}\n```\n\n#### VoteChoice\n\nType-safe vote choices:\n\n```typescript\nenum VoteChoice {\n  For = 0, // Vote in favor\n  Against = 1, // Vote against\n  Abstain = 2, // Abstain from voting\n}\n```\n\n### GovernorAPI\n\n#### Static Methods\n\n##### deploy()\n\n```typescript\nstatic async deploy(\n  providers: GovernorProviders,\n  config: DeploymentConfig,\n  logger?: Logger\n): Promise<GovernorAPI>\n```\n\nDeploys a new governor contract with the specified configuration.\n\n**Parameters:**\n\n- `providers`: Initialized providers (from `initializeProviders`)\n- `config`: Deployment configuration\n- `logger` (optional): Pino logger instance\n\n**Returns:** GovernorAPI instance\n\n**Throws:**\n\n- `InvalidConfigurationError`: Invalid configuration parameters\n- `DeploymentError`: Contract deployment failed\n- `WalletNotConnectedError`: Wallet not connected\n\n**Example:**\n\n```typescript\nconst api = await GovernorAPI.deploy(providers, config, logger);\n```\n\n##### join()\n\n```typescript\nstatic async join(\n  providers: GovernorProviders,\n  contractAddress: ContractAddress,\n  logger?: Logger\n): Promise<GovernorAPI>\n```\n\nJoins an existing governor contract.\n\n**Parameters:**\n\n- `providers`: Initialized providers\n- `contractAddress`: Address of deployed contract\n- `logger` (optional): Pino logger instance\n\n**Returns:** GovernorAPI instance\n\n**Throws:**\n\n- `ContractNotFoundError`: Contract not found at address\n- `WalletNotConnectedError`: Wallet not connected\n\n#### Instance Methods\n\n##### createProposal()\n\n```typescript\nasync createProposal(\n  title: string,\n  description: string,\n  creator: Uint8Array,\n  actions: ProposalAction[]\n): Promise<{ txData: FinalizedTxData; proposalId: bigint }>\n```\n\nCreates a new governance proposal.\n\n**Parameters:**\n\n- `title`: Proposal title (max 256 chars)\n- `description`: Proposal description (max 10,000 chars)\n- `creator`: Creator address (32 bytes, must have sufficient stake)\n- `actions`: Array of actions to execute if proposal passes\n\n**Returns:** Object with transaction data and proposal ID\n\n**Throws:**\n\n- `InvalidParameterError`: Invalid parameters\n- `InsufficientStakeError`: Creator has insufficient stake\n- `TransactionError`: Transaction failed\n\n**Example:**\n\n```typescript\nconst { proposalId } = await api.createProposal(\n  \"Increase Treasury Allocation\",\n  \"Detailed description of the proposal...\",\n  creatorAddress,\n  [\n    {\n      typ: 0,\n      token: tokenAddress,\n      amount: BigInt(10000),\n      to: recipientAddress,\n      configKey: new Uint8Array(32),\n      configValue: new Uint8Array(32),\n    },\n  ]\n);\n```\n\n##### castVote()\n\n```typescript\nasync castVote(\n  proposalId: bigint,\n  voter: Uint8Array,\n  choice: VoteChoice\n): Promise<FinalizedTxData>\n```\n\nCasts a vote on an active proposal.\n\n**Parameters:**\n\n- `proposalId`: Proposal ID to vote on\n- `voter`: Voter address (32 bytes, must have voting power)\n- `choice`: Vote choice (VoteChoice.For, VoteChoice.Against, or VoteChoice.Abstain)\n\n**Returns:** Transaction data\n\n**Throws:**\n\n- `InvalidParameterError`: Invalid parameters\n- `InsufficientStakeError`: Voter has insufficient voting power\n- `ProposalNotFoundError`: Proposal not found or not active\n- `TransactionError`: Transaction failed\n\n**Example:**\n\n```typescript\nawait api.castVote(proposalId, voterAddress, VoteChoice.For);\n```\n\n##### registerStake()\n\n```typescript\nasync registerStake(\n  userId: Uint8Array,\n  amount: bigint\n): Promise<FinalizedTxData>\n```\n\nRegisters a stake for governance participation.\n\n**Parameters:**\n\n- `userId`: User address (32 bytes)\n- `amount`: Amount to stake\n\n**Returns:** Transaction data\n\n##### finalizeProposal()\n\n```typescript\nasync finalizeProposal(proposalId: bigint): Promise<FinalizedTxData>\n```\n\nFinalizes a proposal after voting period ends.\n\n##### queueProposal()\n\n```typescript\nasync queueProposal(proposalId: bigint): Promise<FinalizedTxData>\n```\n\nQueues a finalized proposal for execution.\n\n##### executeProposal()\n\n```typescript\nasync executeProposal(\n  proposalId: bigint,\n  effectId: bigint\n): Promise<FinalizedTxData>\n```\n\nExecutes a queued proposal after execution delay.\n\n##### getProposalDetails()\n\n```typescript\nasync getProposalDetails(proposalId: bigint): Promise<ProposalDetails>\n```\n\nGets detailed information about a proposal.\n\n##### getProposalVoteCount()\n\n```typescript\nasync getProposalVoteCount(proposalId: bigint): Promise<VoteCount>\n```\n\nGets vote counts for a proposal.\n\n##### getStakeInfo()\n\n```typescript\nasync getStakeInfo(userId: Uint8Array): Promise<StakeInfo>\n```\n\nGets staking information for a user.\n\n### initializeProviders()\n\n```typescript\nasync function initializeProviders(logger: Logger): Promise<GovernorProviders>;\n```\n\nInitializes all required providers for governance operations.\n\n**What it does:**\n\n1. Connects to Lace wallet extension\n2. Requests user authorization\n3. Retrieves wallet state and service URIs\n4. Configures all providers (IndexedDB, HTTP, Indexer, Wallet, Proof server)\n\n**Parameters:**\n\n- `logger`: Pino logger instance\n\n**Returns:** Configured providers object\n\n**Throws:**\n\n- Error if Lace wallet not found\n- Error if wallet connection rejected\n- Error if incompatible wallet version\n\n**Example:**\n\n```typescript\nconst providers = await initializeProviders(logger);\n```\n\n### GovernorManager\n\nHigh-level API with observable state management.\n\n#### Constructor\n\n```typescript\nconstructor(\n  deploymentConfig: DeploymentConfig,\n  logger: Logger\n)\n```\n\n**Parameters:**\n\n- `deploymentConfig`: Deployment configuration\n- `logger`: Pino logger instance\n\n**Example:**\n\n```typescript\nconst manager = new GovernorManager(config, logger);\n```\n\n#### Methods\n\n##### resolve()\n\n```typescript\nresolve(contractAddress?: ContractAddress): Observable<GovernorDeployment>\n```\n\nDeploys a new contract or joins an existing one, with observable state.\n\n**Returns:** Observable that emits deployment state changes\n\n**Deployment States:**\n\n```typescript\n{ status: 'in-progress' }\n{ status: 'deployed', api: DeployedGovernorAPI }\n{ status: 'failed', error: Error }\n```\n\n## Error Handling\n\n### Custom Error Classes\n\nThe SDK provides specific error classes for different failure scenarios:\n\n```typescript\nimport {\n  GovernorSDKError,\n  WalletNotConnectedError,\n  InsufficientStakeError,\n  InvalidParameterError,\n  ContractNotFoundError,\n  ProposalNotFoundError,\n  TransactionError,\n  DeploymentError,\n  InvalidConfigurationError,\n  NetworkNotConfiguredError,\n} from \"@claritydao/midnight-sdk\";\n```\n\n### Error Handling Pattern\n\n```typescript\ntry {\n  await api.createProposal(title, description, creator, actions);\n} catch (error) {\n  if (error instanceof InsufficientStakeError) {\n    console.error(\"Need more stake:\", error.message);\n  } else if (error instanceof InvalidParameterError) {\n    console.error(\"Invalid input:\", error.message);\n  } else if (error instanceof TransactionError) {\n    console.error(\"Transaction failed:\", error.message);\n  } else {\n    console.error(\"Unexpected error:\", error);\n  }\n}\n```\n\n## Validation\n\nThe SDK includes comprehensive input validation:\n\n```typescript\nimport { validators } from \"@claritydao/midnight-sdk\";\n\n// Validate proposal parameters\nvalidators.validateProposal(title, description, creator);\n\n// Validate vote choice\nvalidators.validateVoteChoice(choice);\n\n// Validate deployment config\nvalidators.validateDeploymentConfig(config);\n\n// Validate governance config\nvalidators.validateGovernanceConfig(governanceConfig);\n```\n\n## Browser Integration\n\n### Critical: Frontend Setup Requirements\n\nBefore integrating this SDK into a browser application, you MUST configure your build tool correctly to handle WASM modules. **Failure to do so will result in the error `ocrt.maxField is not a function`.**\n\n### Required: Vite Configuration\n\n**IMPORTANT:** Use Vite, not Next.js. Next.js 15's Turbopack does not support the webpack configurations required for this WASM pattern.\n\n#### 1. Install Required Vite Plugins\n\n```bash\npnpm add -D vite vite-plugin-wasm vite-plugin-top-level-await @vitejs/plugin-react\n```\n\n#### 2. Create `vite.config.ts`\n\nThis exact configuration is required. It's based on Midnight Network's official `example-bboard` implementation:\n\n```typescript\nimport { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\nimport wasm from \"vite-plugin-wasm\";\nimport topLevelAwait from \"vite-plugin-top-level-await\";\n\nexport default defineConfig({\n  cacheDir: \"./.vite\",\n  build: {\n    target: \"esnext\",\n    minify: false,\n    rollupOptions: {\n      output: {\n        manualChunks: {\n          // CRITICAL: Separate chunk for WASM modules\n          wasm: [\"@midnight-ntwrk/onchain-runtime\"],\n        },\n      },\n    },\n    commonjsOptions: {\n      // CRITICAL: Transform CommonJS to ESM\n      transformMixedEsModules: true,\n      extensions: [\".js\", \".cjs\"],\n      ignoreDynamicRequires: true,\n    },\n  },\n  plugins: [\n    react(),\n    wasm(),\n    topLevelAwait({\n      promiseExportName: \"__tla\",\n      promiseImportName: (i) => `__tla_${i}`,\n    }),\n    // CRITICAL: Custom resolver for WASM module handling\n    {\n      name: \"wasm-module-resolver\",\n      resolveId(source, importer) {\n        if (\n          source === \"@midnight-ntwrk/onchain-runtime\" &&\n          importer &&\n          importer.includes(\"@midnight-ntwrk/compact-runtime\")\n        ) {\n          return {\n            id: source,\n            external: false,\n            moduleSideEffects: true,\n          };\n        }\n        return null;\n      },\n    },\n  ],\n  optimizeDeps: {\n    esbuildOptions: {\n      target: \"esnext\",\n      supported: { \"top-level-await\": true },\n      platform: \"browser\",\n      format: \"esm\",\n      loader: { \".wasm\": \"binary\" },\n    },\n    // CRITICAL: Pre-bundle for CJS→ESM conversion\n    include: [\"@midnight-ntwrk/compact-runtime\"],\n    // CRITICAL: Exclude WASM from optimization\n    exclude: [\n      \"@midnight-ntwrk/onchain-runtime\",\n      \"@midnight-ntwrk/onchain-runtime/midnight_onchain_runtime_wasm_bg.wasm\",\n      \"@midnight-ntwrk/onchain-runtime/midnight_onchain_runtime_wasm.js\",\n    ],\n  },\n  resolve: {\n    extensions: [\".mjs\", \".js\", \".ts\", \".jsx\", \".tsx\", \".json\", \".wasm\"],\n    mainFields: [\"browser\", \"module\", \"main\"],\n  },\n});\n```\n\n#### Why This Configuration is Required\n\nThe SDK depends on `@midnight-ntwrk/compact-runtime`, which:\n\n1. Uses CommonJS (`require()`)\n2. Imports `@midnight-ntwrk/onchain-runtime` (WASM module with top-level await)\n3. Executes `ocrt.maxField()` at the top level\n\nThis creates a CJS/ESM/WASM incompatibility that requires the custom resolver plugin and specific optimization settings.\n\n### Why Next.js Doesn't Work\n\nNext.js 15 uses **Turbopack** by default, which doesn't support the webpack configurations needed:\n\n```typescript\n// These webpack configs don't work with Turbopack:\nconfig.experiments = {\n  asyncWebAssembly: true,\n  topLevelAwait: true,\n};\n```\n\nEven with the `--webpack` flag, the CJS/ESM/WASM interaction is too complex for Next.js to handle correctly.\n\n**Recommendation:** Use Vite for browser dApps (officially supported by Midnight Network).\n\n### React Example\n\n```tsx\nimport {\n  GovernorManager,\n  VoteChoice,\n  ConfigPresets,\n} from \"@claritydao/midnight-sdk\";\nimport { randomBytes } from \"@midnight-ntwrk/midnight-js-utils\";\nimport { useEffect, useState } from \"react\";\nimport pino from \"pino\";\n\nconst logger = pino({ level: \"info\" });\n\nconst config = {\n  governor: {\n    governance: ConfigPresets.testing(),\n    executionDelay: BigInt(60),\n    gracePeriod: BigInt(300),\n    maxActiveProposals: BigInt(100),\n    proposalLifetime: BigInt(3600),\n    emergencyVetoEnabled: true,\n    emergencyVetoThreshold: BigInt(75000),\n  },\n  token: {\n    name: \"Test DAO\",\n    symbol: \"TDAO\",\n    decimals: BigInt(18),\n  },\n  adminKey: randomBytes(32), // CRITICAL: Use secure random bytes!\n};\n\nconst manager = new GovernorManager(config, logger);\n\nfunction GovernanceApp() {\n  const [deployment, setDeployment] = useState(null);\n\n  useEffect(() => {\n    const subscription = manager.resolve().subscribe(setDeployment);\n    return () => subscription.unsubscribe();\n  }, []);\n\n  if (!deployment || deployment.status === \"in-progress\") {\n    return <div>Connecting to wallet and deploying contract...</div>;\n  }\n\n  if (deployment.status === \"failed\") {\n    return <div>Error: {deployment.error.message}</div>;\n  }\n\n  const api = deployment.api;\n\n  const handleCreateProposal = async () => {\n    try {\n      const actions = [\n        {\n          typ: 0,\n          token: tokenAddress,\n          amount: BigInt(1000),\n          to: recipientAddress,\n          configKey: new Uint8Array(32),\n          configValue: new Uint8Array(32),\n        },\n      ];\n\n      const { proposalId } = await api.createProposal(\n        \"My Proposal\",\n        \"Description here\",\n        creatorAddress,\n        actions\n      );\n\n      alert(`Proposal created: ${proposalId}`);\n    } catch (error) {\n      alert(`Error: ${error.message}`);\n    }\n  };\n\n  const handleVote = async (proposalId) => {\n    try {\n      await api.castVote(proposalId, voterAddress, VoteChoice.For);\n      alert(\"Vote cast successfully\");\n    } catch (error) {\n      alert(`Error: ${error.message}`);\n    }\n  };\n\n  return (\n    <div>\n      <h1>Governor Contract</h1>\n      <p>Address: {api.deployedContractAddress}</p>\n\n      <button onClick={handleCreateProposal}>Create Proposal</button>\n      <button onClick={() => handleVote(1n)}>Vote For Proposal #1</button>\n    </div>\n  );\n}\n```\n\n## Security Best Practices\n\n### 1. Always Use Secure Random for Admin Keys\n\n```typescript\nimport { randomBytes } from \"@midnight-ntwrk/midnight-js-utils\";\n\n// ✅ Good: Cryptographically secure random\nconst adminKey = randomBytes(32);\n\n// ❌ Bad: Predictable key\nconst adminKey = new Uint8Array(32); // All zeros - INSECURE!\n```\n\n### 2. Use Configuration Presets\n\n```typescript\n// ✅ Good: Use tested presets\nconst config = ConfigPresets.production();\n\n// ❌ Bad: Hardcoded magic numbers\nconst config = {\n  votingPeriod: BigInt(300), // What does 300 mean?\n  // ...\n};\n```\n\n### 3. Validate User Inputs\n\n```typescript\nimport { validators } from \"@claritydao/midnight-sdk\";\n\n// ✅ Good: Validate before submission\nvalidators.validateProposal(title, description, creator);\nawait api.createProposal(title, description, creator, actions);\n\n// ❌ Bad: No validation\nawait api.createProposal(title, description, creator, actions);\n```\n\n### 4. Handle Errors Gracefully\n\n```typescript\n// ✅ Good: Specific error handling\ntry {\n  await api.castVote(proposalId, voter, choice);\n} catch (error) {\n  if (error instanceof InsufficientStakeError) {\n    showMessage(\"You need more stake to vote\");\n  } else {\n    showMessage(\"An error occurred\");\n  }\n}\n\n// ❌ Bad: Silent failures\ntry {\n  await api.castVote(proposalId, voter, choice);\n} catch (error) {\n  // Silent failure\n}\n```\n\n## Troubleshooting\n\n### Critical: WASM Initialization Error\n\n**Problem:** `TypeError: ocrt.maxField is not a function`\n\n**Root Cause:** CJS/ESM/WASM module incompatibility. The SDK depends on `@midnight-ntwrk/compact-runtime` (CommonJS) which requires `@midnight-ntwrk/onchain-runtime` (WASM with top-level await).\n\n**Solutions:**\n\n1. **Use Vite, not Next.js**\n\n   ```bash\n   # Install Vite and required plugins\n   pnpm add -D vite vite-plugin-wasm vite-plugin-top-level-await @vitejs/plugin-react\n   ```\n\n2. **Configure vite.config.ts correctly** - See \"Browser Integration\" section above for complete configuration\n\n3. **Key configuration requirements:**\n   - Custom `wasm-module-resolver` plugin\n   - `transformMixedEsModules: true` in commonjsOptions\n   - Manual chunks for WASM modules\n   - Proper include/exclude in optimizeDeps\n\n**Error Location:**\n\n```\nFile: node_modules/@midnight-ntwrk/compact-runtime/dist/runtime.js:90\nCode: exports.MAX_FIELD = ocrt.maxField();\n```\n\n**Why Next.js Doesn't Work:**\n\n- Next.js 15 uses Turbopack which doesn't support required webpack configurations\n- Even with `--webpack` flag, the CJS/ESM/WASM interaction is too complex\n\n**Reference Implementations:**\n\n- Working example: Midnight Network's `example-bboard` application\n- Configuration tested and verified in production\n\n### Admin Key Security Error\n\n**Problem:** \"Insecure admin key detected\" or predictable deployment behavior\n\n**Root Cause:** Using an all-zeros Uint8Array for admin key\n\n**Bad Example:**\n\n```typescript\nconst adminKey = new Uint8Array(32); // All zeros - INSECURE!\n```\n\n**Correct Solution:**\n\n```typescript\nimport { randomBytes } from \"@midnight-ntwrk/midnight-js-utils\";\n\nconst adminKey = randomBytes(32); // Cryptographically secure\n```\n\n**Why It Matters:**\n\n- Admin keys control contract upgrades and governance\n- Predictable keys can be exploited\n- All production deployments MUST use secure random keys\n\n### Build Configuration Issues\n\n**Problem:** \"require is not defined\" in browser\n\n**Root Cause:** Contract module uses CommonJS but wasn't transformed to ESM\n\n**Solution:**\n\n```typescript\n// In vite.config.ts\ncommonjsOptions: {\n  transformMixedEsModules: true,\n  extensions: ['.js', '.cjs'],\n}\n```\n\n**Problem:** \"Top-level await is not available\"\n\n**Root Cause:** WASM module with top-level await in wrong bundle chunk\n\n**Solution:**\n\n```typescript\n// In vite.config.ts\nrollupOptions: {\n  output: {\n    manualChunks: {\n      wasm: ['@midnight-ntwrk/onchain-runtime'],\n    },\n  },\n}\n```\n\n**Problem:** Module optimization errors during build\n\n**Root Cause:** Vite trying to optimize WASM and CJS modules together\n\n**Solution:**\n\n```typescript\n// In vite.config.ts\noptimizeDeps: {\n  include: ['@midnight-ntwrk/compact-runtime'],  // Pre-bundle for CJS→ESM\n  exclude: [\n    '@midnight-ntwrk/onchain-runtime',           // Don't optimize WASM\n    '@claritydao/midnight-agora-contracts',              // Don't optimize contract\n  ],\n}\n```\n\n### Wallet Connection Issues\n\n**Problem:** \"Could not find Midnight Lace wallet\"\n\n**Solutions:**\n\n- Install Lace wallet extension from [lace.io](https://www.lace.io/)\n- Refresh the browser page\n- Check browser console for errors\n- Ensure extension is enabled\n\n**Problem:** \"Incompatible version of Midnight Lace wallet\"\n\n**Solutions:**\n\n- Update Lace extension to latest version\n- SDK requires Lace API v1.x\n- Check compatibility in browser console\n\n### Transaction Failures\n\n**Problem:** InsufficientStakeError\n\n**Solutions:**\n\n- Register stake before creating proposals\n- Ensure stake amount ≥ proposalThreshold\n- Check staking period hasn't expired\n\n**Problem:** TransactionError: \"User rejected transaction\"\n\n**Solutions:**\n\n- User must approve transaction in Lace wallet\n- Check wallet has sufficient tDUST balance\n- Verify transaction parameters are correct\n\n### Build Errors\n\n**Problem:** TypeScript compilation errors\n\n**Solutions:**\n\n```bash\n# Update dependencies\npnpm install\n\n# Rebuild SDK\npnpm run build\n```\n\n**Problem:** Module not found errors\n\n**Solutions:**\n\n- Ensure all dependencies are installed\n- Check `node_modules` exists\n- Verify import paths are correct\n\n### Runtime Errors\n\n**Problem:** \"Contract not found at address\"\n\n**Solutions:**\n\n- Verify contract address is correct\n- Check network connection\n- Ensure contract is deployed on current network\n\n**Problem:** \"InvalidParameterError\"\n\n**Solutions:**\n\n- Check parameter types and formats\n- Validate inputs before submission\n- Review API documentation for correct usage\n\n### Cache Issues\n\n**Problem:** Changes not reflected after rebuild\n\n**Solutions:**\n\n```bash\n# Clear Vite cache\nrm -rf node_modules/.vite\n\n# Clear browser cache or hard refresh\n# Chrome/Edge: Ctrl+Shift+R (Windows) or Cmd+Shift+R (Mac)\n# Firefox: Ctrl+F5 (Windows) or Cmd+Shift+R (Mac)\n```\n\n## Development\n\n### Building from Source\n\n```bash\n# Clone repository\ngit clone https://github.com/your-org/agora-dao-midnight-sdk\ncd internalAgoraMidnightSDK\n\n# Install dependencies\npnpm install\n\n# Build contract first\ncd contract\npnpm run build\n\n# Build SDK\ncd ../sdk\npnpm run build\n```\n\n### Project Structure\n\n```\nsdk/\n├── src/\n│   ├── browser-providers.ts    # Lace wallet integration\n│   ├── governor-api.ts          # Main API implementation\n│   ├── manager.ts               # Observable state manager\n│   ├── types.ts                 # Type definitions\n│   ├── errors.ts                # Error classes\n│   ├── validators.ts            # Input validation\n│   ├── common-types.ts          # Shared types\n│   ├── index.ts                 # Main exports\n│   └── utils/                   # Utility functions\n├── package.json\n├── tsconfig.json\n└── README.md\n```\n\n## Prerequisites\n\n### Required Software\n\n1. **Lace Wallet Extension**\n\n   - Install from [lace.io](https://www.lace.io/)\n   - Create or import wallet\n   - Switch to Midnight TestNet\n\n2. **TestNet Tokens (tDUST)**\n\n   - Request from [Midnight Faucet](https://faucet.testnet.midnight.network/)\n   - Needed to pay for transactions\n\n3. **Modern Browser**\n   - Chrome/Edge 89+\n   - Firefox 89+\n   - Safari 15+\n\n### Browser APIs Required\n\n- IndexedDB (private state storage)\n- Web Crypto API (cryptographic operations)\n- Fetch API (HTTP requests)\n- WebSocket (real-time updates)\n\n## Resources\n\n- [Midnight Documentation](https://docs.midnight.network/)\n- [Lace Wallet](https://www.lace.io/)\n- [TestNet Faucet](https://faucet.testnet.midnight.network/)\n- [Compact Language Guide](https://docs.midnight.network/develop/compact/)\n- [Production Readiness Guide](./PRODUCTION_READY.md)\n\n## License\n\nApache-2.0\n\n## Support\n\nFor issues and questions:\n\n- GitHub Issues: [Create an issue](https://github.com/your-org/agora-dao-midnight-sdk/issues)\n- Documentation: [Read the docs](https://docs.midnight.network/)\n","readmeFilename":"README.md"}