# Solbound review brief This is an audit scope and reproducibility guide, not an audit report. The SDK, website and registry have not been independently audited. Automated checks and setup diagnostics do not establish that the system is safe for mainnet. This release is a downloadable **Solana devnet** preview by WAGMI Labs LLC. ## Release to review - SDK name and version: `@solbound-io/sdk` 0.1.0, distributed as `solbound-sdk-0.1.0.tgz`. It is not published to the public npm registry. - `solbound-sdk-manifest.json` identifies the package integrity, SHA-256 of both downloads, and the canonical source hashes used for the SDK core. Compare those hashes with the delivered source before reviewing. - The full reviewer bundle is `review-source/solbound-review.tar.gz`; its paths and `SHA256SUMS.txt` cover the program, clients, SDK, examples, tests and site. Record the source commit and bundle hash in the engagement and final report. - Devnet program: `FX2zKgkTSrmUpQcfNsrahQN7Mer5gfPo6Ec8FLX3SuaR`. - Required devnet genesis: `EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG`. - Pinned 9,216-byte executable SHA-256: `9fdcd1f09c0910a6318eb8f5fd9f963a622d4453987d8c815da9466cc17163f1`. - The program is upgradeable. Independently inspect its ProgramData and upgrade authority and compare the deployed executable with a reproducible build. A pinned-code check is a read at one time, not a guarantee against a later upgrade. ## Intended security boundary A vault signs a public, time-limited permission for a different wallet to represent holdings at integrating websites. This permission does not authorize the delegate to sign transactions from the vault or move its assets. A website authenticates the delegate, checks the permission and any required current holdings, and decides whether to provide its own protected benefit. Creating a grant does not integrate a website. The website receives only public addresses and a one-time message signature. Wallet recovery phrases and private keys are not collected. The SDK's browser and React modules request message signatures only. Grant creation and revocation on Solbound's site are separate vault-signed transactions. ## Review scope 1. **On-chain program and build.** Review `protocol/registry.c`, its native C/SBF build and the actual deployed artifact. Check instruction parsing, signer and System ownership constraints, canonical PDAs, account sizes and tags, audience and collection separation, expiry, epoch-based bulk revocation, renewals, lamport allocation/refunds and account closure. This is not an Anchor-only review. 2. **Transaction and registry clients.** Review `lib/registry.mjs` and `lib/wallet.mjs`. Check deployment/genesis/code validation, finalized reads, simulation, exact message/signature matching, account changes and review invalidation. Assess the upgrade authority trust model and possible changes between read and execution. 3. **Eligibility and holdings.** Review `tools/partner-verifier.mjs` and the generated identical SDK core. Confirm origin-specific and all-app permissions, grant epoch and chain time, NFT ownership and verified collection membership, classic SPL balance accounting and final common-slot reads. Discovery is bounded; a manual candidate must be fully verified rather than trusted. 4. **Website authentication.** Review `sdk/server.mjs`. Test origin and Host checks, the nonce/message/session binding, signature validation, expiry, atomic one-time consumption, opaque cookie rotation, logout, body limits and per-request authorization. An authenticated delegate must come from the server session, not a submitted wallet address. 5. **Concurrency and storage.** Test simultaneous sign-ins, challenge replay and sign-out during a slow verification. A remembered vault/member is a hint only. It is stored separately from authentication and must be checked against current chain state on each protected request. The built-in memory store is single-process development storage; a shared adapter needs atomic consumption across instances. 6. **Browser and framework integration.** Review `sdk/browser.mjs`, `sdk/react.mjs` and both examples. Check message parsing, account changes, cancellation and late wallet responses, same-origin endpoints, existing sessions, protected response delivery and cache behavior. The protected callback must never run after a denial or verification error. 7. **Distribution and operations.** Verify that the tarball contains only enumerated inputs and no keys or configuration secrets. Test installation into a separate project, the export/type boundaries, dependency findings and build provenance. Diagnostics must not expose RPC credentials, imply an audit, or authorize protected content. Review domain, hosting, release permissions and incident response separately from code. ## Required negative cases - Wrong delegate, vault, audience, asset or collection; malformed or noncanonical grant accounts. - No grant, expired grant, changed vault epoch, closed grant and overlapping permissions. - Resold NFT, changed collection membership or insufficient balance despite an active grant. - Wrong network, altered program bytes, stale chain time, missing accounts and RPC outages. - Reused or expired login challenge, another browser's cookie, wrong origin, wrong signature and changed wallet during the prompt. - Successful manual lookup followed by revocation before protected content is requested. - Logout or session expiry while verification is in flight, including a slow shared store. - Multi-instance deployments without shared atomic challenge consumption. - A healthy diagnostics endpoint while the application's actual protected route is missing its access check. ## Reproduce the checks From the complete source checkout, use Node.js 24 and the locked dependencies: ```sh npm ci npm test npm run package:sdk npm run test:consumer npm run build npm run test:ui ``` `npm test` prepares SDK core files from the canonical source and runs unit, protocol-interface, HTTP authentication, browser-helper and SDK checks. The UI suite exercises the exported website. Tests use throwaway identities or controlled RPC fixtures; passing them is not a live-chain acceptance test or a third-party review. Independently download the package and examples, verify their checksums, and install the package in an empty consumer project. Run both examples and the SDK doctor. Repeat a real devnet grant, current-holdings check, expiry and revocation against a separately selected RPC. Do not use mainnet funds or production vault keys for testing. ## Decisions before a public mainnet release Obtain an independent review and remediation retest tied to exact commits and binaries. Decide and disclose upgrade governance, production storage/rate limits/monitoring, RPC trust and availability, supported asset standards, a security contact and incident procedure. Classic SPL and supported Token Metadata NFTs are the current adapters; Token-2022, compressed NFTs and Metaplex Core are not covered by this release. Publish the agreed audit scope, report and fix status only after the reviewer confirms them. Use independent integration pilots and documented release history as adoption evidence. WAGMI-owned examples, automated tests and an npm account should not be presented as third-party endorsements or certification.