/** * @file ProjectRegistry.ts * @description TypeScript client for InkdRegistry.sol — the core project registry contract. * Use this module to create projects, push versions, manage collaborators, * and transfer ownership on-chain. * * @example * ```ts * import { ProjectRegistry } from "@inkd/sdk"; * import { createWalletClient, createPublicClient, http } from "viem"; * import { base } from "viem/chains"; * * const registry = new ProjectRegistry({ * registryAddress: "0x...", * tokenAddress: "0x...", * chainId: 8453, * }); * * registry.connect(walletClient, publicClient); * * // Create a project (locks 1 $INKD) * const { projectId } = await registry.createProject({ * name: "my-agent-brain", * description: "Persistent memory store for AI agent", * license: "MIT", * isPublic: true, * isAgent: true, * agentEndpoint: "https://api.myagent.xyz", * }); * * // Push a version * await registry.pushVersion({ * projectId, * arweaveHash: "ar://your-file-hash", * versionTag: "v1.0.0", * changelog: "Initial release", * }); * ``` */ import type { PublicClient, WalletClient, Account, Chain, Transport } from "viem"; /** Minimal ABI fragment for InkdRegistry.sol */ export declare const INKD_REGISTRY_ABI: readonly [{ readonly type: "function"; readonly name: "projectCount"; readonly inputs: readonly []; readonly outputs: readonly [{ readonly name: ""; readonly type: "uint256"; }]; readonly stateMutability: "view"; }, { readonly type: "function"; readonly name: "versionFee"; readonly inputs: readonly []; readonly outputs: readonly [{ readonly name: ""; readonly type: "uint256"; }]; readonly stateMutability: "view"; }, { readonly type: "function"; readonly name: "transferFee"; readonly inputs: readonly []; readonly outputs: readonly [{ readonly name: ""; readonly type: "uint256"; }]; readonly stateMutability: "view"; }, { readonly type: "function"; readonly name: "TOKEN_LOCK_AMOUNT"; readonly inputs: readonly []; readonly outputs: readonly [{ readonly name: ""; readonly type: "uint256"; }]; readonly stateMutability: "view"; }, { readonly type: "function"; readonly name: "getProject"; readonly inputs: readonly [{ readonly name: "projectId"; readonly type: "uint256"; }]; readonly outputs: readonly [{ readonly name: ""; readonly type: "tuple"; readonly components: readonly [{ readonly name: "id"; readonly type: "uint256"; }, { readonly name: "name"; readonly type: "string"; }, { readonly name: "description"; readonly type: "string"; }, { readonly name: "license"; readonly type: "string"; }, { readonly name: "readmeHash"; readonly type: "string"; }, { readonly name: "owner"; readonly type: "address"; }, { readonly name: "isPublic"; readonly type: "bool"; }, { readonly name: "isAgent"; readonly type: "bool"; }, { readonly name: "agentEndpoint"; readonly type: "string"; }, { readonly name: "createdAt"; readonly type: "uint256"; }, { readonly name: "versionCount"; readonly type: "uint256"; }, { readonly name: "exists"; readonly type: "bool"; }]; }]; readonly stateMutability: "view"; }, { readonly type: "function"; readonly name: "getVersion"; readonly inputs: readonly [{ readonly name: "projectId"; readonly type: "uint256"; }, { readonly name: "versionIndex"; readonly type: "uint256"; }]; readonly outputs: readonly [{ readonly name: ""; readonly type: "tuple"; readonly components: readonly [{ readonly name: "projectId"; readonly type: "uint256"; }, { readonly name: "arweaveHash"; readonly type: "string"; }, { readonly name: "versionTag"; readonly type: "string"; }, { readonly name: "changelog"; readonly type: "string"; }, { readonly name: "pushedBy"; readonly type: "address"; }, { readonly name: "pushedAt"; readonly type: "uint256"; }]; }]; readonly stateMutability: "view"; }, { readonly type: "function"; readonly name: "getVersionCount"; readonly inputs: readonly [{ readonly name: "projectId"; readonly type: "uint256"; }]; readonly outputs: readonly [{ readonly name: ""; readonly type: "uint256"; }]; readonly stateMutability: "view"; }, { readonly type: "function"; readonly name: "getCollaborators"; readonly inputs: readonly [{ readonly name: "projectId"; readonly type: "uint256"; }]; readonly outputs: readonly [{ readonly name: ""; readonly type: "address[]"; }]; readonly stateMutability: "view"; }, { readonly type: "function"; readonly name: "getOwnerProjects"; readonly inputs: readonly [{ readonly name: "owner_"; readonly type: "address"; }]; readonly outputs: readonly [{ readonly name: ""; readonly type: "uint256[]"; }]; readonly stateMutability: "view"; }, { readonly type: "function"; readonly name: "getAgentProjects"; readonly inputs: readonly [{ readonly name: "offset"; readonly type: "uint256"; }, { readonly name: "limit"; readonly type: "uint256"; }]; readonly outputs: readonly [{ readonly name: ""; readonly type: "tuple[]"; readonly components: readonly [{ readonly name: "id"; readonly type: "uint256"; }, { readonly name: "name"; readonly type: "string"; }, { readonly name: "description"; readonly type: "string"; }, { readonly name: "license"; readonly type: "string"; }, { readonly name: "readmeHash"; readonly type: "string"; }, { readonly name: "owner"; readonly type: "address"; }, { readonly name: "isPublic"; readonly type: "bool"; }, { readonly name: "isAgent"; readonly type: "bool"; }, { readonly name: "agentEndpoint"; readonly type: "string"; }, { readonly name: "createdAt"; readonly type: "uint256"; }, { readonly name: "versionCount"; readonly type: "uint256"; }, { readonly name: "exists"; readonly type: "bool"; }]; }]; readonly stateMutability: "view"; }, { readonly type: "function"; readonly name: "isCollaborator"; readonly inputs: readonly [{ readonly name: "projectId"; readonly type: "uint256"; }, { readonly name: "collaborator"; readonly type: "address"; }]; readonly outputs: readonly [{ readonly name: ""; readonly type: "bool"; }]; readonly stateMutability: "view"; }, { readonly type: "function"; readonly name: "nameTaken"; readonly inputs: readonly [{ readonly name: "name"; readonly type: "string"; }]; readonly outputs: readonly [{ readonly name: ""; readonly type: "bool"; }]; readonly stateMutability: "view"; }, { readonly type: "function"; readonly name: "createProject"; readonly inputs: readonly [{ readonly name: "name"; readonly type: "string"; }, { readonly name: "description"; readonly type: "string"; }, { readonly name: "license"; readonly type: "string"; }, { readonly name: "isPublic"; readonly type: "bool"; }, { readonly name: "readmeHash"; readonly type: "string"; }, { readonly name: "isAgent"; readonly type: "bool"; }, { readonly name: "agentEndpoint"; readonly type: "string"; }]; readonly outputs: readonly []; readonly stateMutability: "nonpayable"; }, { readonly type: "function"; readonly name: "pushVersion"; readonly inputs: readonly [{ readonly name: "projectId"; readonly type: "uint256"; }, { readonly name: "arweaveHash"; readonly type: "string"; }, { readonly name: "versionTag"; readonly type: "string"; }, { readonly name: "changelog"; readonly type: "string"; }]; readonly outputs: readonly []; readonly stateMutability: "payable"; }, { readonly type: "function"; readonly name: "addCollaborator"; readonly inputs: readonly [{ readonly name: "projectId"; readonly type: "uint256"; }, { readonly name: "collaborator"; readonly type: "address"; }]; readonly outputs: readonly []; readonly stateMutability: "nonpayable"; }, { readonly type: "function"; readonly name: "removeCollaborator"; readonly inputs: readonly [{ readonly name: "projectId"; readonly type: "uint256"; }, { readonly name: "collaborator"; readonly type: "address"; }]; readonly outputs: readonly []; readonly stateMutability: "nonpayable"; }, { readonly type: "function"; readonly name: "transferProject"; readonly inputs: readonly [{ readonly name: "projectId"; readonly type: "uint256"; }, { readonly name: "newOwner"; readonly type: "address"; }]; readonly outputs: readonly []; readonly stateMutability: "payable"; }, { readonly type: "function"; readonly name: "setVisibility"; readonly inputs: readonly [{ readonly name: "projectId"; readonly type: "uint256"; }, { readonly name: "isPublic"; readonly type: "bool"; }]; readonly outputs: readonly []; readonly stateMutability: "nonpayable"; }, { readonly type: "function"; readonly name: "setReadme"; readonly inputs: readonly [{ readonly name: "projectId"; readonly type: "uint256"; }, { readonly name: "arweaveHash"; readonly type: "string"; }]; readonly outputs: readonly []; readonly stateMutability: "nonpayable"; }, { readonly type: "function"; readonly name: "setAgentEndpoint"; readonly inputs: readonly [{ readonly name: "projectId"; readonly type: "uint256"; }, { readonly name: "endpoint"; readonly type: "string"; }]; readonly outputs: readonly []; readonly stateMutability: "nonpayable"; }, { readonly type: "event"; readonly name: "ProjectCreated"; readonly inputs: readonly [{ readonly name: "projectId"; readonly type: "uint256"; readonly indexed: true; }, { readonly name: "owner"; readonly type: "address"; readonly indexed: true; }, { readonly name: "name"; readonly type: "string"; readonly indexed: false; }, { readonly name: "license"; readonly type: "string"; readonly indexed: false; }]; }, { readonly type: "event"; readonly name: "VersionPushed"; readonly inputs: readonly [{ readonly name: "projectId"; readonly type: "uint256"; readonly indexed: true; }, { readonly name: "arweaveHash"; readonly type: "string"; readonly indexed: false; }, { readonly name: "versionTag"; readonly type: "string"; readonly indexed: false; }, { readonly name: "pushedBy"; readonly type: "address"; readonly indexed: false; }]; }]; /** Minimal ABI fragment for InkdToken.sol (ERC-20 approve) */ export declare const INKD_ERC20_ABI: readonly [{ readonly type: "function"; readonly name: "approve"; readonly inputs: readonly [{ readonly name: "spender"; readonly type: "address"; }, { readonly name: "amount"; readonly type: "uint256"; }]; readonly outputs: readonly [{ readonly name: ""; readonly type: "bool"; }]; readonly stateMutability: "nonpayable"; }, { readonly type: "function"; readonly name: "allowance"; readonly inputs: readonly [{ readonly name: "owner"; readonly type: "address"; }, { readonly name: "spender"; readonly type: "address"; }]; readonly outputs: readonly [{ readonly name: ""; readonly type: "uint256"; }]; readonly stateMutability: "view"; }, { readonly type: "function"; readonly name: "balanceOf"; readonly inputs: readonly [{ readonly name: "account"; readonly type: "address"; }]; readonly outputs: readonly [{ readonly name: ""; readonly type: "uint256"; }]; readonly stateMutability: "view"; }]; export type Address = `0x${string}`; /** Mirrors InkdRegistry.Project struct */ export interface Project { id: bigint; name: string; description: string; license: string; readmeHash: string; owner: Address; isPublic: boolean; isAgent: boolean; agentEndpoint: string; createdAt: bigint; versionCount: bigint; exists: boolean; } /** Mirrors InkdRegistry.Version struct */ export interface ProjectVersion { projectId: bigint; arweaveHash: string; versionTag: string; changelog: string; pushedBy: Address; pushedAt: bigint; } /** Options for creating a project */ export interface CreateProjectOptions { /** Unique project name. Normalized to lowercase on-chain. */ name: string; /** Human-readable description. */ description?: string; /** SPDX license identifier, e.g. "MIT", "GPL-3.0", "Proprietary". */ license?: string; /** Whether the project is publicly listed. Default: true. */ isPublic?: boolean; /** Arweave hash of the README file. */ readmeHash?: string; /** Whether this project represents an AI agent. */ isAgent?: boolean; /** Agent API endpoint (only relevant when isAgent=true). */ agentEndpoint?: string; } /** Options for pushing a version */ export interface PushVersionOptions { /** Project ID to push to. */ projectId: bigint; /** Arweave transaction hash of the uploaded file. */ arweaveHash: string; /** Version identifier, e.g. "v1.0.0" or "checkpoint-42". */ versionTag: string; /** Human-readable changelog entry. */ changelog?: string; } /** Result from createProject() */ export interface CreateProjectResult { /** Transaction hash. */ hash: Address; /** The new project's on-chain ID. */ projectId: bigint; } /** Result from pushVersion() */ export interface PushVersionResult { /** Transaction hash. */ hash: Address; /** The version index within the project (0-based). */ versionIndex: bigint; } /** Registry client configuration */ export interface ProjectRegistryConfig { /** InkdRegistry proxy address. */ registryAddress: Address; /** $INKD ERC-20 token address. */ tokenAddress: Address; /** Chain ID (8453 = Base, 84532 = Base Sepolia). */ chainId: 8453 | 84532; } export declare class RegistryNotConnected extends Error { constructor(); } export declare class InsufficientInkdBalance extends Error { constructor(balance: bigint, required: bigint); } export declare class InsufficientEthBalance extends Error { constructor(fee: bigint); } /** * TypeScript client for InkdRegistry.sol. * * Wraps all on-chain registry operations with typed inputs/outputs, * automatic $INKD approval, and fee estimation. */ export declare class ProjectRegistry { private config; private walletClient; private publicClient; constructor(config: ProjectRegistryConfig); /** * Attach viem wallet + public clients. * Must be called before any on-chain write. */ connect(walletClient: WalletClient, publicClient: PublicClient): void; /** Get a project by ID. Returns null if the project does not exist. */ getProject(projectId: bigint): Promise; /** Get a specific version from a project. */ getVersion(projectId: bigint, versionIndex: bigint): Promise; /** Get all versions of a project in chronological order. */ getAllVersions(projectId: bigint): Promise; /** Get all project IDs owned by an address. */ getOwnerProjects(owner: Address): Promise; /** Get all collaborators of a project. */ getCollaborators(projectId: bigint): Promise; /** Check if an address is a collaborator on a project. */ isCollaborator(projectId: bigint, address: Address): Promise; /** Check if a project name is already taken (case-insensitive). */ isNameTaken(name: string): Promise; /** Get all agent projects with optional pagination. */ getAgentProjects(offset?: bigint, limit?: bigint): Promise; /** Get the current version fee (ETH wei). */ getVersionFee(): Promise; /** Get the current transfer fee (ETH wei). */ getTransferFee(): Promise; /** Get the total number of projects on-chain. */ getProjectCount(): Promise; /** * Create a new project on-chain. * * Automatically approves the 1 $INKD token lock if the current allowance * is insufficient. * * @throws {InsufficientInkdBalance} if caller has less than 1 $INKD. */ createProject(opts: CreateProjectOptions): Promise; /** * Push a new version to an existing project. * * Automatically reads the current versionFee and sends the exact amount. * If you want to overpay (all excess goes to treasury), pass `value` explicitly. * * @throws {InsufficientEthBalance} if caller's ETH balance < versionFee. */ pushVersion(opts: PushVersionOptions, value?: bigint): Promise; /** Add a collaborator to a project. Caller must be the project owner. */ addCollaborator(projectId: bigint, collaborator: Address): Promise
; /** Remove a collaborator from a project. Caller must be the project owner. */ removeCollaborator(projectId: bigint, collaborator: Address): Promise
; /** * Transfer project ownership to a new address. * Automatically reads the current transferFee and sends the exact amount. * * Note: the 1 $INKD lock stays with the project — it is NOT refunded or * transferred back to the old owner. */ transferProject(projectId: bigint, newOwner: Address, value?: bigint): Promise
; /** Set project public/private visibility. Caller must be the project owner. */ setVisibility(projectId: bigint, isPublic: boolean): Promise
; /** Update the README Arweave hash. Caller must be the project owner. */ setReadme(projectId: bigint, arweaveHash: string): Promise
; /** Update the agent endpoint URL. Caller must be the project owner. */ setAgentEndpoint(projectId: bigint, endpoint: string): Promise
; /** * Estimate the total ETH cost of one version push. * (versionFee — gas excluded) */ estimatePushCost(): Promise; /** * Estimate the total ETH cost of a project transfer. * (transferFee — gas excluded) */ estimateTransferCost(): Promise; private requireWallet; private requirePublic; /** * Extract the new project ID from the ProjectCreated event. * Falls back to 0n if not found (should not happen under normal conditions). */ private extractProjectIdFromLogs; } //# sourceMappingURL=ProjectRegistry.d.ts.map