@iqlabs-official/git-sdk 0.1.12 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.d.ts +2 -1
- package/dist/browser/index.js +3 -459
- package/dist/browser/index.js.map +1 -1
- package/dist/chunk-EZNMA5NJ.js +635 -0
- package/dist/chunk-EZNMA5NJ.js.map +1 -0
- package/dist/chunk-WHYUXIRW.js +120 -0
- package/dist/chunk-WHYUXIRW.js.map +1 -0
- package/dist/eth-BQ57E7OY.js +88 -0
- package/dist/eth-BQ57E7OY.js.map +1 -0
- package/dist/node/index.d.ts +2 -1
- package/dist/node/index.js +3 -458
- package/dist/node/index.js.map +1 -1
- package/dist/shared/index.d.ts +150 -32
- package/dist/shared/index.js +2 -447
- package/dist/shared/index.js.map +1 -1
- package/package.json +16 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/hash.ts","../src/layers/chain/solana.ts","../src/layers/chain/eth-lazy.ts","../src/layers/chain/index.ts","../src/layers/commit.ts","../src/layers/repo.ts","../src/layers/storage.ts","../src/layers/client.ts","../src/layers/pages.ts","../src/layers/network.ts"],"names":["sdkCodeIn","sdkReadCodeIn","sdkCreateTable","sdkWriteRow","tablePda"],"mappings":"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","file":"chunk-EZNMA5NJ.js","sourcesContent":["// SHA-256 content hashing for the blob-dedup index. Runtime-specific\n// implementations live in `platform/hash-node.ts` and `platform/hash-browser.ts`;\n// this module just declares the interface the rest of the SDK uses.\n//\n// Do NOT use this for deriving table seeds — that path is owned by\n// `iqlabs.utils.toSeedBytes` (keccak) and must stay aligned with the SDK.\n\n/**\n * SHA-256 of a UTF-8 or base64 string, returned as a lowercase hex digest.\n * Implementation is injected by the platform entry (node.ts / browser.ts).\n */\nexport type Sha256Hex = (input: string) => Promise<string>;\n\n// Platform entries (src/node.ts, src/browser.ts) will call `setSha256(...)`\n// during module init so downstream layers never care which runtime they are in.\n// This indirection is the one place where a wrapper is justified (CODE-RULES §1)\n// because the behavior genuinely differs per runtime.\nlet impl: Sha256Hex | undefined;\n\nexport function setSha256(fn: Sha256Hex): void {\n if (impl) {\n throw new Error(\n \"@iqlabs-official/git-sdk: sha256 implementation already installed. Import exactly one of '@iqlabs-official/git-sdk/node' or '@iqlabs-official/git-sdk/browser'.\",\n );\n }\n impl = fn;\n}\n\nexport async function sha256Hex(input: string): Promise<string> {\n if (!impl) {\n throw new Error(\n \"@iqlabs-official/git-sdk: sha256 not installed. Import '@iqlabs-official/git-sdk/node' (Node) or '@iqlabs-official/git-sdk/browser' (browser) before using the SDK.\",\n );\n }\n return impl(input);\n}\n","// L1 — Solana adapter. The original `chain.ts` body, re-shaped as a `ChainOps`\n// implementation: PDA derivation stays hidden behind hints, reads prefer the\n// iq-gateway HTTP cache then fall back to direct RPC, and the createTable /\n// writeRow / ensureDbRoot calls that commit/repo used to import straight from\n// `solana-sdk/writer` now live here behind the seam.\n//\n// The `Connection` is held in module state, wired once by `init()` — no caller\n// above L1 threads a connection anymore.\n\nimport {\n Keypair,\n PublicKey,\n SystemProgram,\n Transaction,\n type Connection,\n} from \"@solana/web3.js\";\nimport {\n createInstructionBuilder,\n getDbRootPda,\n getTablePda,\n initializeDbRootInstruction,\n} from \"@iqlabs-official/solana-sdk/contract\";\nimport {\n readCodeIn as sdkReadCodeIn,\n readTableRows,\n} from \"@iqlabs-official/solana-sdk/reader\";\nimport {\n toSeedBytes,\n type SignerInput,\n type WalletSigner,\n} from \"@iqlabs-official/solana-sdk/utils\";\nimport {\n codeIn as sdkCodeIn,\n createTable as sdkCreateTable,\n writeRow as sdkWriteRow,\n} from \"@iqlabs-official/solana-sdk/writer\";\nimport { IQGIT_ROOT_ID } from \"../../core/seed\";\nimport { readCodeInViaGateway, readRowsViaGateway } from \"../gateway\";\nimport type {\n ChainConfig,\n ChainOps,\n GitSigner,\n ReadOptions,\n Row,\n SessionSpeed,\n TableRef,\n} from \"./types\";\n\n/** DbRoot PDA for the `iq-git-v1` namespace — derived once, reused everywhere. */\nconst DB_ROOT_SEED = toSeedBytes(IQGIT_ROOT_ID);\nconst DB_ROOT = getDbRootPda(DB_ROOT_SEED);\n\n// Wired by init(). Reads use a process-global RPC (setRpcUrl) like before;\n// writes need the actual Connection the caller configured.\nlet connection: Connection | null = null;\n\nfunction conn(): Connection {\n if (!connection) {\n throw new Error(\"solana adapter not initialized — call init({ chain: 'solana', connection })\");\n }\n return connection;\n}\n\n// Narrow the chain-neutral signer union back to a Solana SignerInput.\nfunction asSolana(signer: GitSigner): SignerInput {\n return signer as SignerInput;\n}\n\n// Sign a single Transaction with whatever shape the signer takes. Keypair has\n// a `secretKey`; wallet adapters expose `signTransaction`. Mirrors solana-sdk's\n// own sendTx dispatch so this helper stays self-contained.\nasync function signTx(signer: SignerInput, tx: Transaction): Promise<Transaction> {\n if (signer instanceof Keypair || \"secretKey\" in signer) {\n tx.partialSign(signer as Keypair);\n return tx;\n }\n return (signer as WalletSigner).signTransaction(tx);\n}\n\n// DbRoot PDA for a given root id. The default `iq-git-v1` reuses the cached\n// `DB_ROOT` so iq-git derivation stays byte-identical; other roots (iq-pages)\n// derive on the fly.\nfunction dbRootPda(dbRootId: string): PublicKey {\n return dbRootId === IQGIT_ROOT_ID ? DB_ROOT : getDbRootPda(toSeedBytes(dbRootId));\n}\n\nfunction tablePda(hint: string, dbRootId = IQGIT_ROOT_ID): PublicKey {\n return getTablePda(dbRootPda(dbRootId), toSeedBytes(hint));\n}\n\nasync function accountExists(pda: PublicKey): Promise<boolean> {\n return (await conn().getAccountInfo(pda)) !== null;\n}\n\nasync function readRowsByPda(\n pda: PublicKey,\n options?: ReadOptions,\n): Promise<Row[]> {\n const viaGateway = await readRowsViaGateway(pda.toBase58(), options);\n if (viaGateway !== null) return viaGateway;\n return readTableRows(pda, options);\n}\n\nexport const solanaAdapter: ChainOps = {\n kind: \"solana\",\n\n init(cfg: ChainConfig): void {\n if (cfg.chain !== \"solana\") return;\n connection = cfg.connection;\n },\n\n async codeIn(\n signer: GitSigner,\n data: string | string[],\n filename: string,\n filetype: string,\n onProgress?: (percent: number) => void,\n speed: SessionSpeed = \"light\",\n ): Promise<string> {\n // \"light\" is the Helius-friendly default for bursty per-file git uploads.\n return sdkCodeIn(\n { connection: conn(), signer: asSolana(signer) },\n data,\n filename,\n 0,\n filetype,\n onProgress,\n speed,\n );\n },\n\n async readCodeIn(\n txSig: string,\n ): Promise<{ data: string | null; metadata: string }> {\n const viaGateway = await readCodeInViaGateway(txSig);\n if (viaGateway !== null) return viaGateway;\n return sdkReadCodeIn(txSig);\n },\n\n async readRows(hint: string, options?: ReadOptions): Promise<Row[]> {\n return readRowsByPda(tablePda(hint), options);\n },\n\n async readRowsByRef(ref: TableRef, options?: ReadOptions): Promise<Row[]> {\n return readRowsByPda(ref as PublicKey, options);\n },\n\n async readLatestRow(hint: string): Promise<Row | null> {\n const rows = await this.readRows(hint, { limit: 1 });\n return rows[0] ?? null;\n },\n\n async signerAddress(signer: GitSigner): Promise<string> {\n return asSolana(signer).publicKey.toBase58();\n },\n\n async ensureDbRoot(signer: GitSigner, dbRootId = IQGIT_ROOT_ID): Promise<string | null> {\n const s = asSolana(signer);\n const rootPda = dbRootPda(dbRootId);\n if (await accountExists(rootPda)) return null;\n const builder = createInstructionBuilder();\n const ix = initializeDbRootInstruction(\n builder,\n {\n db_root: rootPda,\n signer: s.publicKey,\n system_program: SystemProgram.programId,\n },\n { db_root_id: toSeedBytes(dbRootId) },\n );\n const tx = new Transaction().add(ix);\n const c = conn();\n const { blockhash, lastValidBlockHeight } = await c.getLatestBlockhash();\n tx.recentBlockhash = blockhash;\n tx.feePayer = s.publicKey;\n const signed = await signTx(s, tx);\n const signature = await c.sendRawTransaction(signed.serialize());\n await c.confirmTransaction({ signature, blockhash, lastValidBlockHeight });\n return signature;\n },\n\n async createTable(\n signer: GitSigner,\n hint: string,\n columns: string[],\n idColumn: string,\n options?: { writers?: string[]; dbRootId?: string },\n ): Promise<string | null> {\n const s = asSolana(signer);\n // writers omitted ⇒ open table (registry); array ⇒ restricted writers.\n const writers = options?.writers?.map((w) => new PublicKey(w));\n return sdkCreateTable(\n conn(),\n s,\n options?.dbRootId ?? IQGIT_ROOT_ID,\n hint,\n hint,\n columns,\n idColumn,\n [],\n undefined,\n writers,\n hint,\n );\n },\n\n async writeRow(\n signer: GitSigner,\n hint: string,\n rowJson: string,\n dbRootId = IQGIT_ROOT_ID,\n ): Promise<string> {\n return sdkWriteRow(conn(), asSolana(signer), dbRootId, hint, rowJson);\n },\n\n async transferNative(\n signer: GitSigner,\n to: string,\n amount: number | bigint,\n ): Promise<string> {\n const s = asSolana(signer);\n const c = conn();\n const tx = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: s.publicKey,\n toPubkey: new PublicKey(to),\n lamports: Number(amount),\n }),\n );\n tx.feePayer = s.publicKey;\n const { blockhash, lastValidBlockHeight } = await c.getLatestBlockhash();\n tx.recentBlockhash = blockhash;\n const signed = await signTx(s, tx);\n const signature = await c.sendRawTransaction(signed.serialize());\n await c.confirmTransaction(\n { signature, blockhash, lastValidBlockHeight },\n \"confirmed\",\n );\n return signature;\n },\n\n async tableExists(hint: string, dbRootId = IQGIT_ROOT_ID): Promise<boolean> {\n return accountExists(tablePda(hint, dbRootId));\n },\n\n tableRef(hint: string, dbRootId = IQGIT_ROOT_ID): TableRef {\n return tablePda(hint, dbRootId);\n },\n\n tableKey(hint: string, dbRootId = IQGIT_ROOT_ID): string {\n return tablePda(hint, dbRootId).toBase58();\n },\n};\n","// L1 — lazy front for the EVM adapter. Keeps `@iqlabs-official/ethereum-sdk`\n// (and ethers) out of the import graph until an EVM op actually runs, so a\n// Solana-only consumer can install the git-SDK without those optional peer\n// deps. The real adapter lives in `./eth`; it's pulled in via a dynamic\n// `import()` (a separate bundle chunk) on first async use.\n//\n// Sync methods (`tableRef`, `tableKey`) and gateway wiring need no ethereum-sdk\n// and run without loading the real adapter — so `setNetwork('eth')` routes\n// gateway reads correctly even before the first on-chain call.\n\nimport { IQGIT_ROOT_ID } from \"../../core/seed\";\nimport { setEthGatewayNetwork } from \"../gateway\";\nimport type {\n ChainConfig,\n ChainOps,\n GitSigner,\n ReadOptions,\n Row,\n SessionSpeed,\n TableRef,\n} from \"./types\";\n\nlet real: ChainOps | null = null;\nlet pending: ChainConfig | null = null;\n\nasync function load(): Promise<ChainOps> {\n if (!real) {\n real = (await import(\"./eth\")).ethAdapter;\n if (pending) real.init(pending);\n }\n return real;\n}\n\nexport const ethAdapter: ChainOps = {\n kind: \"eth\",\n\n init(cfg: ChainConfig): void {\n pending = cfg;\n // Gateway routing needs no ethereum-sdk — wire it eagerly so reads route\n // to the right EVM network before the real adapter is loaded.\n if (cfg.chain === \"eth\") setEthGatewayNetwork(cfg.network);\n if (real) real.init(cfg);\n },\n\n async codeIn(\n signer: GitSigner,\n data: string | string[],\n filename: string,\n filetype: string,\n onProgress?: (percent: number) => void,\n speed?: SessionSpeed,\n ): Promise<string> {\n return (await load()).codeIn(signer, data, filename, filetype, onProgress, speed);\n },\n\n async readCodeIn(txId: string): Promise<{ data: string | null; metadata: string }> {\n return (await load()).readCodeIn(txId);\n },\n\n async readRows(hint: string, options?: ReadOptions): Promise<Row[]> {\n return (await load()).readRows(hint, options);\n },\n\n async readRowsByRef(ref: TableRef, options?: ReadOptions): Promise<Row[]> {\n return (await load()).readRowsByRef(ref, options);\n },\n\n async readLatestRow(hint: string): Promise<Row | null> {\n return (await load()).readLatestRow(hint);\n },\n\n async signerAddress(signer: GitSigner): Promise<string> {\n return (await load()).signerAddress(signer);\n },\n\n async ensureDbRoot(signer: GitSigner, dbRootId?: string): Promise<string | null> {\n return (await load()).ensureDbRoot(signer, dbRootId);\n },\n\n async createTable(\n signer: GitSigner,\n hint: string,\n columns: string[],\n idColumn: string,\n options?: { writers?: string[]; dbRootId?: string },\n ): Promise<string | null> {\n return (await load()).createTable(signer, hint, columns, idColumn, options);\n },\n\n async writeRow(\n signer: GitSigner,\n hint: string,\n rowJson: string,\n dbRootId?: string,\n ): Promise<string> {\n return (await load()).writeRow(signer, hint, rowJson, dbRootId);\n },\n\n async transferNative(\n signer: GitSigner,\n to: string,\n amount: number | bigint,\n ): Promise<string> {\n return (await load()).transferNative(signer, to, amount);\n },\n\n async tableExists(hint: string, dbRootId?: string): Promise<boolean> {\n return (await load()).tableExists(hint, dbRootId);\n },\n\n // Sync — same coordinates the real adapter returns, no ethereum-sdk needed.\n tableRef(hint: string, dbRootId = IQGIT_ROOT_ID): TableRef {\n return { dbRootId, tableName: hint };\n },\n\n tableKey(hint: string): string {\n return hint;\n },\n};\n","// L1 — chain selector. Holds the active adapter and re-exports its `ChainOps`\n// as flat functions so L2/L3 keep calling `chain.codeIn(...)`,\n// `chain.writeRow(...)`, etc. without knowing which chain backs them.\n//\n// Default is Solana — byte-identical to the pre-port behaviour. `setChain`\n// flips the active adapter; `initChain` wires that adapter's runtime. Both\n// adapters are statically imported, but neither touches the network at import\n// (their `init()` is the only wiring point), so selecting one never trips the\n// other's RPC.\n\nimport { solanaAdapter } from \"./solana\";\nimport { ethAdapter } from \"./eth-lazy\";\nimport type {\n ChainConfig,\n ChainOps,\n GitSigner,\n ReadOptions,\n Row,\n SessionSpeed,\n TableRef,\n} from \"./types\";\n\nexport type {\n ChainConfig,\n ChainOps,\n EthNetwork,\n GitSigner,\n ReadOptions,\n Row,\n SessionSpeed,\n TableRef,\n} from \"./types\";\n\nexport type ChainKind = \"solana\" | \"eth\";\n\nlet active: ChainOps = solanaAdapter;\n\n/** Select the active chain adapter. Pure — does not touch the network. */\nexport function setChain(kind: ChainKind): void {\n active = kind === \"eth\" ? ethAdapter : solanaAdapter;\n}\n\n/** Wire the active adapter's runtime (connection / network). */\nexport function initChain(cfg: ChainConfig): void {\n active.init(cfg);\n}\n\n/** The active adapter's kind — for callers that need to branch on it. */\nexport function activeChain(): ChainKind {\n return active.kind;\n}\n\n// ---- ChainOps re-exported as flat functions bound to the active adapter ----\n\nexport function codeIn(\n signer: GitSigner,\n data: string | string[],\n filename: string,\n filetype: string,\n onProgress?: (percent: number) => void,\n speed?: SessionSpeed,\n): Promise<string> {\n return active.codeIn(signer, data, filename, filetype, onProgress, speed);\n}\n\nexport function readCodeIn(\n txId: string,\n): Promise<{ data: string | null; metadata: string }> {\n return active.readCodeIn(txId);\n}\n\nexport function readRows(hint: string, options?: ReadOptions): Promise<Row[]> {\n return active.readRows(hint, options);\n}\n\nexport function readRowsByRef(ref: TableRef, options?: ReadOptions): Promise<Row[]> {\n return active.readRowsByRef(ref, options);\n}\n\nexport function readLatestRow(hint: string): Promise<Row | null> {\n return active.readLatestRow(hint);\n}\n\nexport function signerAddress(signer: GitSigner): Promise<string> {\n return active.signerAddress(signer);\n}\n\nexport function ensureDbRoot(signer: GitSigner, dbRootId?: string): Promise<string | null> {\n return active.ensureDbRoot(signer, dbRootId);\n}\n\nexport function createTable(\n signer: GitSigner,\n hint: string,\n columns: string[],\n idColumn: string,\n options?: { writers?: string[]; dbRootId?: string },\n): Promise<string | null> {\n return active.createTable(signer, hint, columns, idColumn, options);\n}\n\nexport function writeRow(\n signer: GitSigner,\n hint: string,\n rowJson: string,\n dbRootId?: string,\n): Promise<string> {\n return active.writeRow(signer, hint, rowJson, dbRootId);\n}\n\nexport function transferNative(\n signer: GitSigner,\n to: string,\n amount: number | bigint,\n): Promise<string> {\n return active.transferNative(signer, to, amount);\n}\n\nexport function tableExists(hint: string, dbRootId?: string): Promise<boolean> {\n return active.tableExists(hint, dbRootId);\n}\n\nexport function tableRef(hint: string, dbRootId?: string): TableRef {\n return active.tableRef(hint, dbRootId);\n}\n\nexport function tableKey(hint: string, dbRootId?: string): string {\n return active.tableKey(hint, dbRootId);\n}\n","// L3 — per-repo commit table.\n//\n// v2's core invariant: each repo has its own table at hint\n// `git_commits:<owner>:<repo>`, with writers locked to [owner]. That means\n// \"the most recent successful tx in this table = the latest commit\", and we\n// read it as a single-row query (limit: 1).\n\nimport { commitTableHint } from \"../core/seed\";\nimport type { Commit } from \"../core/types\";\nimport * as chain from \"./chain\";\nimport type { GitSigner, TableRef } from \"./chain\";\nimport { notifyGateways } from \"./gateway\";\n\nconst COMMIT_COLUMNS = [\n \"id\",\n \"message\",\n \"treeTxId\",\n \"parentCommitId\",\n \"timestamp\",\n \"author\",\n];\n\n/**\n * Ensure the per-repo commit table exists with writers = [owner]. No-op if\n * it already exists.\n */\nexport async function ensureCommitTable(\n signer: GitSigner,\n repo: string,\n): Promise<string | null> {\n await chain.ensureDbRoot(signer);\n const owner = await chain.signerAddress(signer);\n const hint = commitTableHint(owner, repo);\n if (await chain.tableExists(hint)) return null;\n return chain.createTable(signer, hint, COMMIT_COLUMNS, \"id\", { writers: [owner] });\n}\n\n/**\n * Append one commit row. Callers (workflow-level code) are responsible for\n * setting parentCommitId — the SDK does not auto-chain.\n *\n * After the row lands on-chain, fires a best-effort /notify so any\n * iq-gateway already caching this table prepends the new commit without\n * waiting for RPC sig indexing.\n */\nexport async function writeCommit(\n signer: GitSigner,\n repo: string,\n commit: Commit,\n): Promise<string> {\n const owner = await chain.signerAddress(signer);\n const hint = commitTableHint(owner, repo);\n const sig = await chain.writeRow(signer, hint, JSON.stringify(commit));\n notifyGateways(chain.tableKey(hint), sig, commit, owner);\n return sig;\n}\n\n/** The commit-table reference for a repo. The one place owner/repo collapses\n * to a chain handle — every read keys off it, so callers that already have a\n * ref (a .sol record, a dbroot match) skip this and pass it straight in. */\nexport function commitTableRef(owner: string, repo: string): TableRef {\n return chain.tableRef(commitTableHint(owner, repo));\n}\n\n/** Latest commit. Single-row, O(1) read path. */\nexport async function readLatestCommit(ref: TableRef): Promise<Commit | null> {\n const rows = await chain.readRowsByRef(ref, { limit: 1 });\n return (rows[0] as unknown as Commit) ?? null;\n}\n\n/** Full commit history, newest first. */\nexport async function readCommitHistory(\n ref: TableRef,\n options?: { limit?: number; before?: string },\n): Promise<Commit[]> {\n const rows = await chain.readRowsByRef(ref, options);\n return rows as unknown as Commit[];\n}\n","// L3 — repo list and public registry.\n//\n// Covers the two \"directory\" tables:\n// • git_repos_v2_<owner> — owner's personal repo list (writers = [owner])\n// • git_repos:all — public gallery registry (writers = [])\n//\n// Commit tables are a separate concern — see `commit.ts`.\n\nimport { REGISTRY_HINT, repoListHint } from \"../core/seed\";\nimport type { RegistryEntry, Repository } from \"../core/types\";\nimport * as chain from \"./chain\";\nimport type { GitSigner } from \"./chain\";\nimport { notifyGateways } from \"./gateway\";\n\nconst REPO_COLUMNS = [\"name\", \"description\", \"isPublic\", \"timestamp\"];\nconst REGISTRY_COLUMNS = [\"owner\", \"repo\", \"description\", \"timestamp\"];\n\n/**\n * Create a repo in the owner's personal list, and (if public) also register\n * it in the public gallery. Two transactions — the contract does not support\n * writing two tables atomically.\n *\n * Returns the writeRow tx signatures (and the table hint each one wrote to)\n * so a caller can notify gateways / build SSE streams for those tables. The\n * returned shape is `[]` from `createTable` calls because those don't write\n * a row, just allocate the account.\n */\nexport async function createRepo(\n signer: GitSigner,\n meta: Repository,\n): Promise<Array<{ tableHint: string; sig: string; row: object }>> {\n await chain.ensureDbRoot(signer);\n const owner = await chain.signerAddress(signer);\n const listHint = repoListHint(owner);\n const writes: Array<{ tableHint: string; sig: string; row: object }> = [];\n\n if (!(await chain.tableExists(listHint))) {\n await chain.createTable(signer, listHint, REPO_COLUMNS, \"name\", { writers: [owner] });\n }\n\n const sig = await chain.writeRow(signer, listHint, JSON.stringify(meta));\n writes.push({ tableHint: listHint, sig, row: meta });\n notifyGateways(chain.tableKey(listHint), sig, meta, owner);\n\n if (meta.isPublic) {\n if (!(await chain.tableExists(REGISTRY_HINT))) {\n await chain.createTable(signer, REGISTRY_HINT, REGISTRY_COLUMNS, \"owner\");\n }\n const entry: RegistryEntry = {\n owner,\n repo: meta.name,\n description: meta.description,\n timestamp: meta.timestamp,\n };\n const regSig = await chain.writeRow(signer, REGISTRY_HINT, JSON.stringify(entry));\n writes.push({ tableHint: REGISTRY_HINT, sig: regSig, row: entry });\n notifyGateways(chain.tableKey(REGISTRY_HINT), regSig, entry, owner);\n }\n\n return writes;\n}\n\n/** List all repos owned by `owner`. */\nexport async function readOwnerRepos(owner: string): Promise<Repository[]> {\n return (await chain.readRows(repoListHint(owner))) as unknown as Repository[];\n}\n\n/**\n * One page of the public-gallery registry. Callers should still check\n * `row.owner` shape before trusting it in UI; we do not filter at the SDK\n * boundary.\n */\nexport async function readRegistryPage(\n options?: { limit?: number; before?: string },\n): Promise<RegistryEntry[]> {\n return (await chain.readRows(REGISTRY_HINT, options)) as unknown as RegistryEntry[];\n}\n\n/**\n * One-time global bootstrap of the `git_repos:all` table. Run once per\n * network from an admin key; subsequent calls short-circuit because the\n * account already exists.\n */\nexport async function bootstrapRegistry(signer: GitSigner): Promise<string | null> {\n await chain.ensureDbRoot(signer);\n if (await chain.tableExists(REGISTRY_HINT)) {\n return null;\n }\n // No `writers` ⇒ open table: anyone can register a public repo.\n return chain.createTable(signer, REGISTRY_HINT, REGISTRY_COLUMNS, \"owner\");\n}\n","// L2 — blob + tree storage.\n//\n// `uploadBlob` is the file-level \"don't re-upload what's already on-chain\"\n// primitive. Content is always a base64 string (matching iq-git v1) so the\n// hash / dedup comparison stays byte-for-byte compatible across commits.\n// The reuse-map is just a plain object so callers can build it any way they\n// like (path→entry, or hash→txId for rename-aware dedup — CODE-RULES §3\n// keeps this inlined at the call site instead of a new type).\n//\n// `uploadTree` / `loadTree` serialize FileTree <-> on-chain tree.json as raw\n// JSON (filetype `application/json`), again matching v1.\n\nimport { sha256Hex } from \"../core/hash\";\nimport type { FileTree } from \"../core/types\";\nimport * as chain from \"./chain\";\nimport type { GitSigner } from \"./chain\";\n\n/**\n * Upload one file unless an identical hash is already in `reuse` (blob dedup).\n *\n * input: connection, signer, relativePath, base64 content, reuse map, optional onProgress\n * output: { txId, hash } — either reused or freshly uploaded\n */\nexport async function uploadBlob(\n signer: GitSigner,\n relativePath: string,\n base64Content: string,\n reuse: FileTree,\n onProgress?: (percent: number) => void,\n speed?: chain.SessionSpeed,\n): Promise<{ txId: string; hash: string }> {\n const hash = await sha256Hex(base64Content);\n const prior = reuse[relativePath];\n if (prior && prior.hash === hash) return prior;\n\n // Tag the codeIn filename with our app marker so non-inline inventory\n // entries can be classified by inspecting metadata.filename alone (no row\n // body fetch needed). Format: \"iqgit-blob:<basename>\". Same scheme used\n // for trees (\"iqgit-tree\") and other writes across the IQ ecosystem.\n const basename = relativePath.split(\"/\").pop() || relativePath;\n const txId = await chain.codeIn(\n signer,\n base64Content,\n `iqgit-blob:${basename}`,\n \"application/octet-stream\",\n onProgress,\n speed,\n );\n return { txId, hash };\n}\n\n/**\n * Serialize a FileTree and upload it as one `tree.json` blob.\n */\nexport async function uploadTree(\n signer: GitSigner,\n tree: FileTree,\n speed?: chain.SessionSpeed,\n): Promise<string> {\n return chain.codeIn(\n signer,\n JSON.stringify(tree),\n \"iqgit-tree\",\n \"application/json\",\n undefined,\n speed,\n );\n}\n\n/**\n * Fetch and parse a `tree.json` blob by its tx signature.\n */\nexport async function loadTree(treeTxId: string): Promise<FileTree> {\n const { data } = await chain.readCodeIn(treeTxId);\n if (data === null) {\n throw new Error(`tree.json not found for tx ${treeTxId}`);\n }\n return JSON.parse(data) as FileTree;\n}\n\n/**\n * Retrieve a blob's bytes by its txId. Returns the raw string that was\n * uploaded — for blobs this is base64; the caller decodes.\n */\nexport async function loadBlob(txId: string): Promise<string> {\n const { data } = await chain.readCodeIn(txId);\n if (data === null) {\n throw new Error(`blob not found for tx ${txId}`);\n }\n return data;\n}\n","// L4 — GitClient facade. High-level workflows built by composing the\n// layers below. This is the surface consumers (CLI, frontend, migrator) use;\n// they should not reach into `chain` / `storage` / `repo` / `commit` directly.\n//\n// Keep workflow logic here, not inside lower layers (CODE-RULES §5). When a\n// command needs scanning, hashing, uploading, row writing — this file\n// orchestrates them all.\n\nimport type { Connection } from \"@solana/web3.js\";\nimport { setRpcUrl } from \"@iqlabs-official/solana-sdk\";\nimport type { SignerInput } from \"@iqlabs-official/solana-sdk/utils\";\nimport type { Signer as EthSigner } from \"ethers\";\nimport { sha256Hex } from \"../core/hash\";\nimport { commitTableHint } from \"../core/seed\";\nimport type { Commit, FileTree, Repository } from \"../core/types\";\nimport * as chain from \"./chain\";\nimport { initChain, setChain } from \"./chain\";\nimport type { EthNetwork, GitSigner } from \"./chain\";\nimport * as commitLayer from \"./commit\";\nimport * as repoLayer from \"./repo\";\nimport * as storage from \"./storage\";\n\n/** Information surfaced to the `onWrite` callback for every successful row\n * write the SDK performs. Consumers wire this to their gateway notify so\n * the gateway updates its cache / SSE stream immediately. */\nexport interface WriteEvent {\n /** Resolved table PDA, base58 — pass directly to gateway notify. */\n tablePda: string;\n /** The hint that derived the PDA, in case callers want to log it. */\n tableHint: string;\n /** writeRow tx signature. */\n sig: string;\n /** The row object that was written (already JSON.stringify-able). */\n row: object;\n}\n\n/** Fields common to every chain's client config. */\ninterface BaseClientConfig {\n /** Fires after each successful row write inside the SDK. Fire-and-forget\n * callback for gateway notifies; throwing here will surface to the caller. */\n onWrite?: (event: WriteEvent) => void;\n /** Default session speed for blob / tree uploads (`\"light\"` is the per-op\n * default; Helius-friendly). EVM ignores it. Override per call with\n * `commit({ speed })`. See `SESSION_SPEED_PROFILES`. */\n speed?: chain.SessionSpeed;\n}\n\n/** Solana client: a web3.js `Connection` + a Solana signer. `chain` is\n * optional and defaults to `'solana'` so existing callers keep working. */\nexport interface SolanaClientConfig extends BaseClientConfig {\n chain?: \"solana\";\n connection: Connection;\n signer: SignerInput;\n}\n\n/** EVM client: an ethers `Signer` (carries its provider) + the target EVM\n * network. No `Connection`. */\nexport interface EthClientConfig extends BaseClientConfig {\n chain: \"eth\";\n signer: EthSigner;\n network: EthNetwork;\n /** Optional RPC override; defaults to the network's public endpoint. */\n rpcUrl?: string;\n}\n\nexport type GitClientConfig = SolanaClientConfig | EthClientConfig;\n\nexport class GitClient {\n /** The configured signer, as the chain-neutral union the layers consume. */\n private readonly signer: GitSigner;\n\n constructor(private readonly cfg: GitClientConfig) {\n this.signer = cfg.signer;\n if (cfg.chain === \"eth\") {\n setChain(\"eth\");\n initChain({ chain: \"eth\", network: cfg.network, rpcUrl: cfg.rpcUrl });\n } else {\n setChain(\"solana\");\n initChain({ chain: \"solana\", connection: cfg.connection });\n // The solana-sdk reader path (readTableRows / readCodeIn → loadTree /\n // readLatestCommit) does not take a Connection — it resolves a\n // process-global one from env / setRpcUrl. Writes use `cfg.connection`,\n // so without this reads could hit a different RPC (e.g. the mainnet-beta\n // fallback when no env is set, as in a built browser bundle). Sync the\n // reader's RPC to the connection the caller actually gave us.\n setRpcUrl(cfg.connection.rpcEndpoint);\n }\n }\n\n /**\n * Create a new repo. Wraps repo.createRepo + pre-creating the commit table\n * so the first `commit()` call doesn't need to pay createTable cost.\n */\n async createRepo(meta: Repository): Promise<void> {\n const writes = await repoLayer.createRepo(this.signer, meta);\n await commitLayer.ensureCommitTable(this.signer, meta.name);\n this.fireOnWrite(writes);\n }\n\n /**\n * Incremental commit against a scanned directory snapshot.\n *\n * input: repoName, message, scan — a `{ [path]: base64Content }` map that\n * the caller produced (Node: fs walk + base64; browser: File input).\n * output: newly written Commit\n */\n async commit(\n repoName: string,\n message: string,\n scan: Record<string, string>,\n options?: { speed?: chain.SessionSpeed },\n ): Promise<Commit> {\n const owner = await chain.signerAddress(this.signer);\n const speed = options?.speed ?? this.cfg.speed;\n\n const latest = await commitLayer.readLatestCommit(commitLayer.commitTableRef(owner, repoName));\n const oldTree: FileTree = latest ? await storage.loadTree(latest.treeTxId) : {};\n\n const newTree: FileTree = {};\n for (const [path, content] of Object.entries(scan)) {\n newTree[path] = await storage.uploadBlob(\n this.signer,\n path,\n content,\n oldTree,\n undefined,\n speed,\n );\n }\n\n const treeTxId = await storage.uploadTree(this.signer, newTree, speed);\n\n const commit: Commit = {\n id: crypto.randomUUID(),\n message,\n treeTxId,\n parentCommitId: latest?.id,\n timestamp: Date.now(),\n author: owner,\n };\n const sig = await commitLayer.writeCommit(this.signer, repoName, commit);\n this.fireOnWrite([{ tableHint: commitTableHint(owner, repoName), sig, row: commit }]);\n return commit;\n }\n\n /** Resolve the table hint to a PDA and forward each write to `onWrite`.\n * Wrapped in try/catch per call so a misbehaving notify can't fail the\n * whole batch — but we still surface the error so the consumer knows. */\n private fireOnWrite(writes: Array<{ tableHint: string; sig: string; row: object }>) {\n if (!this.cfg.onWrite) return;\n for (const w of writes) {\n const tablePda = chain.tableKey(w.tableHint);\n this.cfg.onWrite({ tablePda, tableHint: w.tableHint, sig: w.sig, row: w.row });\n }\n }\n\n /**\n * Restore a commit's files into a caller-provided sink. Runtime-neutral\n * shape mirrors `commit`: the caller decides how to write bytes to disk /\n * to a File System Access API handle / anywhere else. `content` is the\n * raw base64 string — the sink decodes.\n */\n async checkout(\n repoName: string,\n commitId: string | \"latest\",\n sink: (path: string, content: string) => Promise<void>,\n ): Promise<Commit> {\n const owner = await chain.signerAddress(this.signer);\n\n const ref = commitLayer.commitTableRef(owner, repoName);\n let target: Commit | null;\n if (commitId === \"latest\") {\n target = await commitLayer.readLatestCommit(ref);\n } else {\n const history = await commitLayer.readCommitHistory(ref);\n target = history.find((c) => c.id === commitId) ?? null;\n }\n if (!target) {\n throw new Error(`commit not found: ${commitId} in ${owner}/${repoName}`);\n }\n\n const tree = await storage.loadTree(target.treeTxId);\n for (const [path, entry] of Object.entries(tree)) {\n const content = await storage.loadBlob(entry.txId);\n await sink(path, content);\n }\n return target;\n }\n\n /**\n * Whole-repo snapshot download — convenience on top of checkout(\"latest\")\n * but reading from someone else's `owner`. We do not require signer to\n * equal owner for reads.\n */\n async clone(\n repoName: string,\n owner: string,\n sink: (path: string, content: string) => Promise<void>,\n ): Promise<Commit> {\n const target = await commitLayer.readLatestCommit(commitLayer.commitTableRef(owner, repoName));\n if (!target) {\n throw new Error(`no commits in ${owner}/${repoName}`);\n }\n const tree = await storage.loadTree(target.treeTxId);\n for (const [path, entry] of Object.entries(tree)) {\n const content = await storage.loadBlob(entry.txId);\n await sink(path, content);\n }\n return target;\n }\n\n /** Commit history for a repo. */\n async log(\n owner: string,\n repoName: string,\n options?: { limit?: number; before?: string },\n ): Promise<Commit[]> {\n return commitLayer.readCommitHistory(commitLayer.commitTableRef(owner, repoName), options);\n }\n\n /**\n * Compare a current directory snapshot to the latest commit's tree.\n */\n async status(\n owner: string,\n repoName: string,\n scan: Record<string, string>,\n ): Promise<{ added: string[]; modified: string[]; unchanged: string[] }> {\n const latest = await commitLayer.readLatestCommit(commitLayer.commitTableRef(owner, repoName));\n const tree: FileTree = latest ? await storage.loadTree(latest.treeTxId) : {};\n\n const added: string[] = [];\n const modified: string[] = [];\n const unchanged: string[] = [];\n for (const [path, content] of Object.entries(scan)) {\n const prior = tree[path];\n if (!prior) {\n added.push(path);\n continue;\n }\n const hash = await sha256Hex(content);\n (prior.hash === hash ? unchanged : modified).push(path);\n }\n return { added, modified, unchanged };\n }\n}\n","// L3 — iq-pages deployment gallery.\n//\n// A \"deploy\" is one marker row appended to a single open-writers table at\n// `iqpages-root/deployed`:\n//\n// { id: \"<owner>:<repo>\", owner, repo, deployedAt }\n//\n// The site's actual files are NOT snapshotted here — they're served live from\n// the repo's latest git commit tree, so a re-commit updates the deployed site\n// without re-deploying. This layer only owns the marker registry + the one-time\n// deploy fee.\n//\n// Unlike repo.ts / commit.ts, pages lives in its OWN DbRoot (\"iqpages-root\").\n// It still goes entirely through the chain seam — every read/write passes\n// `IQPAGES_ROOT_ID` to `chain.*`, so the gallery works on Solana and EVM alike.\n// The deploy fee is the one chain-specific bit: native SOL on Solana, native\n// ETH on EVM, gated on `chain.activeChain()`.\n\nimport * as chain from \"./chain\";\nimport type { GitSigner, TableRef } from \"./chain\";\nimport {\n IQPAGES_CONFIG_FILENAME,\n IQPAGES_DEPLOYED_HINT,\n IQPAGES_PROFILE_FILENAME,\n IQPAGES_ROOT_ID,\n PAGES_FEE_LAMPORTS,\n PAGES_FEE_RECIPIENT,\n PAGES_FEE_RECIPIENT_EVM,\n PAGES_FEE_WEI,\n pagesDeployId,\n} from \"../core/seed\";\nimport type {\n PagesConfig,\n PagesDeployment,\n PagesProfile,\n} from \"../core/types\";\nimport { commitTableRef, readLatestCommit } from \"./commit\";\nimport { notifyGateways } from \"./gateway\";\nimport { loadBlob, loadTree } from \"./storage\";\n\nconst DEPLOYED_COLUMNS = [\"id\", \"owner\", \"repo\", \"deployedAt\"];\n\n/** Ref to the single `iqpages-root/deployed` gallery table. Pages owns the\n * (root, hint) identity; the active adapter resolves it (Solana PDA / EVM\n * coordinates) — chain-neutral. */\nexport function pagesTableRef(): TableRef {\n return chain.tableRef(IQPAGES_DEPLOYED_HINT, IQPAGES_ROOT_ID);\n}\n\n/** Gateway routing key for the gallery table — for the notify call. */\nfunction pagesTableKey(): string {\n return chain.tableKey(IQPAGES_DEPLOYED_HINT, IQPAGES_ROOT_ID);\n}\n\n/** Every deploy marker in the gallery. Gateway-first, RPC fallback (handled by\n * the adapter). */\nexport async function listPagesDeployments(): Promise<PagesDeployment[]> {\n const rows = await chain.readRowsByRef(pagesTableRef());\n return rows as unknown as PagesDeployment[];\n}\n\n/** True if `<owner>/<repo>` already has a deploy marker. */\nexport async function isPagesDeployed(owner: string, repo: string): Promise<boolean> {\n const id = pagesDeployId(owner, repo);\n const all = await listPagesDeployments();\n return all.some((r) => r.id === id);\n}\n\n/** Read a JSON file from the repo's latest commit tree. Returns null when the\n * repo has no commits or the file is absent — never throws on absence. */\nasync function readJsonFromLatest<T>(\n owner: string,\n repo: string,\n filename: string,\n): Promise<T | null> {\n const latest = await readLatestCommit(commitTableRef(owner, repo));\n if (!latest) return null;\n const tree = await loadTree(latest.treeTxId);\n const entry = tree[filename];\n if (!entry?.txId) return null;\n const base64 = await loadBlob(entry.txId);\n return JSON.parse(Buffer.from(base64, \"base64\").toString(\"utf8\")) as T;\n}\n\n/** `iqpages.json` from the repo's latest commit, or null if not committed. */\nexport async function readPagesConfig(\n owner: string,\n repo: string,\n): Promise<PagesConfig | null> {\n return readJsonFromLatest<PagesConfig>(owner, repo, IQPAGES_CONFIG_FILENAME);\n}\n\n/** `iqprofile.json` from the repo's latest commit, or null if not committed. */\nexport async function readPagesProfile(\n owner: string,\n repo: string,\n): Promise<PagesProfile | null> {\n return readJsonFromLatest<PagesProfile>(owner, repo, IQPAGES_PROFILE_FILENAME);\n}\n\n/** Ensure the iqpages DbRoot + the open-writers `deployed` table exist. The\n * gallery is cross-owner, so the table takes no `writers` (anyone can append\n * their own marker). Cheap no-op once both exist. */\nasync function ensureGallery(signer: GitSigner): Promise<void> {\n await chain.ensureDbRoot(signer, IQPAGES_ROOT_ID);\n if (await chain.tableExists(IQPAGES_DEPLOYED_HINT, IQPAGES_ROOT_ID)) return;\n await chain.createTable(signer, IQPAGES_DEPLOYED_HINT, DEPLOYED_COLUMNS, \"id\", {\n dbRootId: IQPAGES_ROOT_ID,\n });\n}\n\n/** Charge the one-time deploy fee in the active chain's native currency.\n * Solana: 0.2 SOL → PAGES_FEE_RECIPIENT. EVM: 0.01 ETH → PAGES_FEE_RECIPIENT_EVM. */\nasync function chargeFee(signer: GitSigner): Promise<void> {\n if (chain.activeChain() === \"eth\") {\n await chain.transferNative(signer, PAGES_FEE_RECIPIENT_EVM, PAGES_FEE_WEI);\n } else {\n await chain.transferNative(signer, PAGES_FEE_RECIPIENT, PAGES_FEE_LAMPORTS);\n }\n}\n\n/**\n * Register `<owner>/<repo>` in the gallery and charge the one-time fee.\n *\n * Pre-flight (in order): not already deployed → `iqpages.json` is committed.\n * Then it ensures the gallery exists, writes the marker row, and transfers the\n * fee in a separate tx (the contract can't do both atomically).\n *\n * Returns the marker-row tx id plus the resolved config so callers can print\n * the live site URL without a second read.\n */\nexport async function deployPages(\n signer: GitSigner,\n repo: string,\n): Promise<{ sig: string; config: PagesConfig }> {\n const owner = await chain.signerAddress(signer);\n\n if (await isPagesDeployed(owner, repo)) {\n throw new Error(`already deployed: ${owner}/${repo}`);\n }\n\n // Sanity-check the manifest before charging — keeps the gallery free of\n // broken links.\n const config = await readPagesConfig(owner, repo);\n if (!config) {\n throw new Error(\n `${IQPAGES_CONFIG_FILENAME} missing in ${repo}. Commit it first, then deploy.`,\n );\n }\n\n await ensureGallery(signer);\n\n const row: PagesDeployment = {\n id: pagesDeployId(owner, repo),\n owner,\n repo,\n deployedAt: Date.now(),\n };\n const sig = await chain.writeRow(\n signer,\n IQPAGES_DEPLOYED_HINT,\n JSON.stringify(row),\n IQPAGES_ROOT_ID,\n );\n notifyGateways(pagesTableKey(), sig, row, owner);\n\n await chargeFee(signer);\n\n return { sig, config };\n}\n","// Top-level network switch — Zo's UX. One `setNetwork(token)` spans both\n// chains: the token implies the chain (like the gateway resolver infers chain\n// from id shape). Solana tokens pick devnet/mainnet; EVM tokens select the\n// adapter + sub-network. `'eth'` is shorthand for the EVM default (sepolia).\n//\n// This configures the *global* read path (the standalone read functions and\n// the gateway). Writes still flow through a `GitClient`, whose constructor\n// wires its own signer + connection/provider.\n\nimport { initChain, setChain } from \"./chain\";\nimport type { EthNetwork } from \"./chain\";\nimport { setSolanaGatewayNetwork } from \"./gateway\";\n\nexport type SolanaNetwork = \"devnet\" | \"mainnet\";\n\n/** Every token `setNetwork` accepts. `'eth'` ⇒ sepolia (EVM default). */\nexport type NetworkToken = SolanaNetwork | \"eth\" | EthNetwork;\n\n// EVM tokens → concrete network. `eth` is the default-EVM alias.\nconst EVM_TOKENS: Record<string, EthNetwork> = {\n eth: \"sepolia\",\n sepolia: \"sepolia\",\n monad: \"monad\",\n monadTestnet: \"monadTestnet\",\n};\n\n/**\n * Switch the active chain + network from a single token.\n *\n * setNetwork('mainnet') // Solana mainnet\n * setNetwork('devnet') // Solana devnet\n * setNetwork('eth') // EVM, sepolia (default)\n * setNetwork('monad', { rpcUrl }) // EVM, monad, custom RPC\n *\n * `rpcUrl` only applies to EVM tokens (the EVM adapter holds the provider);\n * Solana reads resolve their RPC from the gateway / `setRpcUrl`.\n */\nexport function setNetwork(token: NetworkToken, options?: { rpcUrl?: string }): void {\n const evm = EVM_TOKENS[token];\n if (evm) {\n setChain(\"eth\");\n // The eth adapter's init() wires iqlabs network + the gateway network.\n initChain({ chain: \"eth\", network: evm, rpcUrl: options?.rpcUrl });\n return;\n }\n // Solana: reads need no Connection here (gateway / global RPC). Writes use\n // the GitClient's own connection, set when the client is constructed.\n setChain(\"solana\");\n setSolanaGatewayNetwork(token as SolanaNetwork);\n}\n"]}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { getRpcUrl } from '@iqlabs-official/solana-sdk';
|
|
2
|
+
|
|
3
|
+
// src/core/seed.ts
|
|
4
|
+
var IQGIT_ROOT_ID = "iq-git-v1";
|
|
5
|
+
var REGISTRY_HINT = "git_repos:all";
|
|
6
|
+
function repoListHint(owner) {
|
|
7
|
+
return `git_repos_v2_${owner}`;
|
|
8
|
+
}
|
|
9
|
+
function commitTableHint(owner, repo) {
|
|
10
|
+
return `git_commits:${owner}:${repo}`;
|
|
11
|
+
}
|
|
12
|
+
var IQPAGES_ROOT_ID = "iqpages-root";
|
|
13
|
+
var IQPAGES_DEPLOYED_HINT = "deployed";
|
|
14
|
+
var PAGES_FEE_LAMPORTS = 2e8;
|
|
15
|
+
var PAGES_FEE_WEI = 10000000000000000n;
|
|
16
|
+
var PAGES_FEE_RECIPIENT = "EWNSTD8tikwqHMcRNuuNbZrnYJUiJdKq9UXLXSEU4wZ1";
|
|
17
|
+
var PAGES_FEE_RECIPIENT_EVM = "0xE94fA75aB69C18635A35556E9313e8D2aE009459";
|
|
18
|
+
var IQPAGES_CONFIG_FILENAME = "iqpages.json";
|
|
19
|
+
var IQPAGES_PROFILE_FILENAME = "iqprofile.json";
|
|
20
|
+
function pagesDeployId(owner, repo) {
|
|
21
|
+
return `${owner}:${repo}`;
|
|
22
|
+
}
|
|
23
|
+
var MAINNET_GATEWAY = "https://gateway.iqlabs.dev";
|
|
24
|
+
var DEVNET_GATEWAY = "https://dev-gateway.iqlabs.dev";
|
|
25
|
+
var REQ_TIMEOUT_MS = 5e3;
|
|
26
|
+
var runtimeGateways = null;
|
|
27
|
+
var solanaNetwork = null;
|
|
28
|
+
var activeChain = "solana";
|
|
29
|
+
var ethNetwork = "sepolia";
|
|
30
|
+
function setGatewayUrls(urls) {
|
|
31
|
+
runtimeGateways = urls.length > 0 ? urls : null;
|
|
32
|
+
}
|
|
33
|
+
function setSolanaGatewayNetwork(network) {
|
|
34
|
+
activeChain = "solana";
|
|
35
|
+
solanaNetwork = network;
|
|
36
|
+
}
|
|
37
|
+
function setEthGatewayNetwork(network) {
|
|
38
|
+
activeChain = "eth";
|
|
39
|
+
ethNetwork = network;
|
|
40
|
+
}
|
|
41
|
+
function inferSolanaNetwork() {
|
|
42
|
+
if (solanaNetwork) return solanaNetwork;
|
|
43
|
+
const u = getRpcUrl().toLowerCase();
|
|
44
|
+
if (u.includes("devnet") || u.includes("testnet")) return "devnet";
|
|
45
|
+
return "mainnet";
|
|
46
|
+
}
|
|
47
|
+
function getGatewayUrls() {
|
|
48
|
+
if (runtimeGateways) return runtimeGateways;
|
|
49
|
+
const env = (typeof process !== "undefined" && process.env?.IQGIT_GATEWAYS) ?? "";
|
|
50
|
+
if (env) return env.split(",").map((s) => s.trim()).filter(Boolean);
|
|
51
|
+
if (activeChain === "eth") return [MAINNET_GATEWAY];
|
|
52
|
+
return inferSolanaNetwork() === "devnet" ? [DEVNET_GATEWAY] : [MAINNET_GATEWAY];
|
|
53
|
+
}
|
|
54
|
+
async function tryGateways(path, parse) {
|
|
55
|
+
for (const gw of getGatewayUrls()) {
|
|
56
|
+
try {
|
|
57
|
+
const ctrl = new AbortController();
|
|
58
|
+
const timer = setTimeout(() => ctrl.abort(), REQ_TIMEOUT_MS);
|
|
59
|
+
const res = await fetch(path(gw), { signal: ctrl.signal });
|
|
60
|
+
clearTimeout(timer);
|
|
61
|
+
if (res.ok) return await parse(res);
|
|
62
|
+
} catch {
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
function rowsQuery(options, network) {
|
|
68
|
+
const qs = new URLSearchParams();
|
|
69
|
+
if (options?.limit) qs.set("limit", String(options.limit));
|
|
70
|
+
if (options?.before) qs.set("before", options.before);
|
|
71
|
+
if (network) qs.set("network", network);
|
|
72
|
+
return qs.toString() ? `?${qs}` : "";
|
|
73
|
+
}
|
|
74
|
+
async function readRowsViaGateway(pdaBase58, options) {
|
|
75
|
+
const suffix = rowsQuery(options);
|
|
76
|
+
return tryGateways(
|
|
77
|
+
(gw) => `${gw}/table/${pdaBase58}/rows${suffix}`,
|
|
78
|
+
async (res) => {
|
|
79
|
+
const json = await res.json();
|
|
80
|
+
return json.rows ?? [];
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
async function readRowsByNameViaGateway(dbRootId, tableName, network, options) {
|
|
85
|
+
const suffix = rowsQuery(options, network);
|
|
86
|
+
return tryGateways(
|
|
87
|
+
(gw) => `${gw}/table/${dbRootId}/${tableName}/rows${suffix}`,
|
|
88
|
+
async (res) => {
|
|
89
|
+
const json = await res.json();
|
|
90
|
+
return json.rows ?? [];
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
async function readCodeInViaGateway(txId, network) {
|
|
95
|
+
const suffix = network ? `?network=${network}` : "";
|
|
96
|
+
return tryGateways(
|
|
97
|
+
(gw) => `${gw}/data/${txId}${suffix}`,
|
|
98
|
+
async (res) => {
|
|
99
|
+
const json = await res.json();
|
|
100
|
+
return { data: json.data ?? null, metadata: json.metadata ?? "" };
|
|
101
|
+
}
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
function notifyGateways(tableKey, txSig, row, signer) {
|
|
105
|
+
const network = activeChain === "eth" ? ethNetwork : void 0;
|
|
106
|
+
const body = JSON.stringify({ txSignature: txSig, row, signer, network });
|
|
107
|
+
const suffix = network ? `?network=${network}` : "";
|
|
108
|
+
for (const gw of getGatewayUrls()) {
|
|
109
|
+
fetch(`${gw}/table/${tableKey}/notify${suffix}`, {
|
|
110
|
+
method: "POST",
|
|
111
|
+
headers: { "content-type": "application/json" },
|
|
112
|
+
body
|
|
113
|
+
}).catch(() => {
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export { IQGIT_ROOT_ID, IQPAGES_CONFIG_FILENAME, IQPAGES_DEPLOYED_HINT, IQPAGES_PROFILE_FILENAME, IQPAGES_ROOT_ID, PAGES_FEE_LAMPORTS, PAGES_FEE_RECIPIENT, PAGES_FEE_RECIPIENT_EVM, PAGES_FEE_WEI, REGISTRY_HINT, commitTableHint, getGatewayUrls, notifyGateways, pagesDeployId, readCodeInViaGateway, readRowsByNameViaGateway, readRowsViaGateway, repoListHint, setEthGatewayNetwork, setGatewayUrls, setSolanaGatewayNetwork };
|
|
119
|
+
//# sourceMappingURL=chunk-WHYUXIRW.js.map
|
|
120
|
+
//# sourceMappingURL=chunk-WHYUXIRW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/seed.ts","../src/layers/gateway.ts"],"names":[],"mappings":"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","file":"chunk-WHYUXIRW.js","sourcesContent":["// The single source of truth for table_hint strings.\n//\n// Readers re-derive PDAs with `iqlabs.utils.toSeedBytes(hint)` →\n// `iqlabs.contract.getTablePda(...)`; writers pass the same hint into\n// `iqlabs.writer.createTable`. Keeping the naming convention in one place\n// prevents silent drift between writer and reader. CODE-RULES §2 — if any\n// caller ever wants to build one of these strings inline, route it here\n// instead.\n\n/** DbRoot id for every iq-git table. Bootstrap and every caller share this. */\nexport const IQGIT_ROOT_ID = \"iq-git-v1\";\n\n/** `git_repos:all` — open-writers registry that drives the public gallery. */\nexport const REGISTRY_HINT = \"git_repos:all\";\n\n/**\n * Hint for the per-owner personal repo list.\n * input: owner wallet base58\n * output: \"git_repos_v2_<owner>\"\n */\nexport function repoListHint(owner: string): string {\n return `git_repos_v2_${owner}`;\n}\n\n/**\n * Hint for the per-repo commit table.\n * input: owner wallet base58, repo name (any characters — SDK keccak-hashes)\n * output: \"git_commits:<owner>:<repo>\"\n */\nexport function commitTableHint(owner: string, repo: string): string {\n return `git_commits:${owner}:${repo}`;\n}\n\n// === iq-pages ===\n//\n// Pages lives in its OWN DbRoot (\"iqpages-root\"), not the iq-git one — the\n// gallery is a cross-owner registry with open writers, so it can't share\n// `iq-git-v1`'s per-owner table layout. The pages layer passes IQPAGES_ROOT_ID\n// to the chain seam (`chain.tableRef(hint, IQPAGES_ROOT_ID)`, etc.) rather than\n// relying on the adapters' default iq-git root.\n\n/** DbRoot id for the iq-pages deployment gallery. */\nexport const IQPAGES_ROOT_ID = \"iqpages-root\";\n\n/** Single open-writers table that holds every deploy marker row. */\nexport const IQPAGES_DEPLOYED_HINT = \"deployed\";\n\n/** One-time deploy fee on Solana, in lamports (0.2 SOL). */\nexport const PAGES_FEE_LAMPORTS = 200_000_000;\n\n/** One-time deploy fee on EVM, in wei (0.01 ETH — value-matched to 0.2 SOL). */\nexport const PAGES_FEE_WEI = 10_000_000_000_000_000n;\n\n/** Receiver of the Solana deploy fee. Same hard receiver the contract uses. */\nexport const PAGES_FEE_RECIPIENT = \"EWNSTD8tikwqHMcRNuuNbZrnYJUiJdKq9UXLXSEU4wZ1\";\n\n/** Receiver of the EVM deploy fee — the same address the ethereum-sdk's\n * on-chain `feeReceiver()` resolves to across sepolia / monad / monadTestnet\n * (verified identical on all three). Pages fee is an app-layer transfer\n * outside the contract, so we send it to the protocol's fee wallet directly. */\nexport const PAGES_FEE_RECIPIENT_EVM = \"0xE94fA75aB69C18635A35556E9313e8D2aE009459\";\n\n/** Config / profile filenames a repo must commit to be deployable. */\nexport const IQPAGES_CONFIG_FILENAME = \"iqpages.json\";\nexport const IQPAGES_PROFILE_FILENAME = \"iqprofile.json\";\n\n/**\n * Deploy-marker row id.\n * input: owner wallet address, repo name\n * output: \"<owner>:<repo>\"\n */\nexport function pagesDeployId(owner: string, repo: string): string {\n return `${owner}:${repo}`;\n}\n","// L1.5 — iq-gateway HTTP helpers. Multi-chain: the gateway at\n// gateway.iqlabs.dev serves Solana + EVM (sepolia / monad / monadTestnet) in\n// one process, routing per request by `?network=` or by id shape.\n//\n// The chain adapters dispatch reads through here first; on a null return they\n// fall back to direct RPC. Writers fire-and-forget a notify so the gateway can\n// prepend the new row to its head-page cache without waiting on RPC indexing.\n//\n// Read shapes:\n// Solana table GET /table/{pda}/rows\n// EVM table GET /table/{dbRootId}/{tableName}/rows?network=<evmnet>\n// blob (either) GET /data/{txId} (id shape auto-routes; an EVM\n// network override is appended for non-default EVM chains)\n//\n// Configuration precedence for the gateway URL (high → low):\n// 1. setGatewayUrls([...]) — explicit list ([] disables)\n// 2. IQGIT_GATEWAYS env (csv)\n// 3. active chain / network — EVM ⇒ the multi-chain mainnet gateway;\n// Solana ⇒ devnet/mainnet by override or RPC\n// 4. Mainnet default — gateway.iqlabs.dev\n//\n// Everything here is best-effort: an unreachable/disabled gateway never breaks\n// the SDK.\n\nimport { getRpcUrl } from \"@iqlabs-official/solana-sdk\";\nimport type { EthNetwork } from \"./chain\";\n\nconst MAINNET_GATEWAY = \"https://gateway.iqlabs.dev\";\nconst DEVNET_GATEWAY = \"https://dev-gateway.iqlabs.dev\";\nconst REQ_TIMEOUT_MS = 5000;\n\nlet runtimeGateways: string[] | null = null;\nlet solanaNetwork: \"mainnet\" | \"devnet\" | null = null;\nlet activeChain: \"solana\" | \"eth\" = \"solana\";\nlet ethNetwork: EthNetwork = \"sepolia\";\n\n/** Pin the gateway URL list explicitly. Highest precedence. Pass `[]` to\n * disable gateway dispatch entirely (RPC-only mode). */\nexport function setGatewayUrls(urls: string[]): void {\n runtimeGateways = urls.length > 0 ? urls : null;\n}\n\n/** Point the gateway at a Solana network. Used by the top-level `setNetwork`\n * and as the back-compat `setNetwork(\"mainnet\"|\"devnet\")` shim. */\nexport function setSolanaGatewayNetwork(network: \"mainnet\" | \"devnet\"): void {\n activeChain = \"solana\";\n solanaNetwork = network;\n}\n\n/** Point the gateway at an EVM network. Called by the eth adapter's `init()`\n * and the top-level `setNetwork`. */\nexport function setEthGatewayNetwork(network: EthNetwork): void {\n activeChain = \"eth\";\n ethNetwork = network;\n}\n\nfunction inferSolanaNetwork(): \"mainnet\" | \"devnet\" {\n if (solanaNetwork) return solanaNetwork;\n const u = getRpcUrl().toLowerCase();\n if (u.includes(\"devnet\") || u.includes(\"testnet\")) return \"devnet\";\n return \"mainnet\";\n}\n\nexport function getGatewayUrls(): string[] {\n if (runtimeGateways) return runtimeGateways;\n\n const env = (typeof process !== \"undefined\" && process.env?.IQGIT_GATEWAYS) ?? \"\";\n if (env) return env.split(\",\").map((s) => s.trim()).filter(Boolean);\n\n // The multi-chain gateway lives on the mainnet host and serves every EVM\n // network behind `?network=`.\n if (activeChain === \"eth\") return [MAINNET_GATEWAY];\n return inferSolanaNetwork() === \"devnet\" ? [DEVNET_GATEWAY] : [MAINNET_GATEWAY];\n}\n\nasync function tryGateways<T>(\n path: (gw: string) => string,\n parse: (res: Response) => Promise<T>,\n): Promise<T | null> {\n for (const gw of getGatewayUrls()) {\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), REQ_TIMEOUT_MS);\n const res = await fetch(path(gw), { signal: ctrl.signal });\n clearTimeout(timer);\n if (res.ok) return await parse(res);\n } catch {\n // Try the next gateway.\n }\n }\n return null;\n}\n\nfunction rowsQuery(options?: { limit?: number; before?: string }, network?: string): string {\n const qs = new URLSearchParams();\n if (options?.limit) qs.set(\"limit\", String(options.limit));\n if (options?.before) qs.set(\"before\", options.before);\n if (network) qs.set(\"network\", network);\n return qs.toString() ? `?${qs}` : \"\";\n}\n\n/** Solana table read: rows for a table PDA via /table/:pda/rows. Null when no\n * gateway is configured or all fail — caller falls back to RPC. */\nexport async function readRowsViaGateway(\n pdaBase58: string,\n options?: { limit?: number; before?: string },\n): Promise<Array<Record<string, unknown>> | null> {\n const suffix = rowsQuery(options);\n return tryGateways(\n (gw) => `${gw}/table/${pdaBase58}/rows${suffix}`,\n async (res) => {\n const json = (await res.json()) as { rows?: unknown[] };\n return (json.rows ?? []) as Array<Record<string, unknown>>;\n },\n );\n}\n\n/** EVM table read: rows for a `(dbRootId, tableName)` via\n * /table/:root/:name/rows?network=<evmnet>. */\nexport async function readRowsByNameViaGateway(\n dbRootId: string,\n tableName: string,\n network: EthNetwork,\n options?: { limit?: number; before?: string },\n): Promise<Array<Record<string, unknown>> | null> {\n const suffix = rowsQuery(options, network);\n return tryGateways(\n (gw) => `${gw}/table/${dbRootId}/${tableName}/rows${suffix}`,\n async (res) => {\n const json = (await res.json()) as { rows?: unknown[] };\n return (json.rows ?? []) as Array<Record<string, unknown>>;\n },\n );\n}\n\n/** Raw codeIn payload via /data/:id. The id shape auto-routes (base58 →\n * Solana, `0x` → EVM); `network` pins a non-default EVM chain (monad). */\nexport async function readCodeInViaGateway(\n txId: string,\n network?: EthNetwork,\n): Promise<{ data: string | null; metadata: string } | null> {\n const suffix = network ? `?network=${network}` : \"\";\n return tryGateways(\n (gw) => `${gw}/data/${txId}${suffix}`,\n async (res) => {\n const json = (await res.json()) as { data?: string | null; metadata?: string };\n return { data: json.data ?? null, metadata: json.metadata ?? \"\" };\n },\n );\n}\n\n/** Fire-and-forget /notify after a successful write. Includes the row body so\n * the gateway can inject without an RPC roundtrip. Errors are swallowed — the\n * row is already on-chain, gateway hydration is opportunistic. */\nexport function notifyGateways(\n tableKey: string,\n txSig: string,\n row: object,\n signer: string,\n): void {\n const network = activeChain === \"eth\" ? ethNetwork : undefined;\n const body = JSON.stringify({ txSignature: txSig, row, signer, network });\n const suffix = network ? `?network=${network}` : \"\";\n for (const gw of getGatewayUrls()) {\n fetch(`${gw}/table/${tableKey}/notify${suffix}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body,\n }).catch(() => {});\n }\n}\n"]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { IQGIT_ROOT_ID, readRowsByNameViaGateway, readCodeInViaGateway, setEthGatewayNetwork } from './chunk-WHYUXIRW.js';
|
|
2
|
+
import iqlabs from '@iqlabs-official/ethereum-sdk';
|
|
3
|
+
|
|
4
|
+
var network = "sepolia";
|
|
5
|
+
function asEth(signer) {
|
|
6
|
+
return signer;
|
|
7
|
+
}
|
|
8
|
+
function toRows(entries) {
|
|
9
|
+
return entries.map((e) => e.data);
|
|
10
|
+
}
|
|
11
|
+
var ethAdapter = {
|
|
12
|
+
kind: "eth",
|
|
13
|
+
init(cfg) {
|
|
14
|
+
if (cfg.chain !== "eth") return;
|
|
15
|
+
network = cfg.network;
|
|
16
|
+
iqlabs.setNetwork(cfg.network, cfg.rpcUrl);
|
|
17
|
+
setEthGatewayNetwork(cfg.network);
|
|
18
|
+
},
|
|
19
|
+
async codeIn(signer, data, filename, filetype, onProgress) {
|
|
20
|
+
return iqlabs.writer.codeIn(asEth(signer), data, filename, filetype, onProgress);
|
|
21
|
+
},
|
|
22
|
+
async readCodeIn(txHash) {
|
|
23
|
+
const viaGateway = await readCodeInViaGateway(txHash, network);
|
|
24
|
+
if (viaGateway !== null) return viaGateway;
|
|
25
|
+
const { data, metadata } = await iqlabs.reader.readCodeIn(txHash);
|
|
26
|
+
return { data: data ?? null, metadata: JSON.stringify(metadata ?? {}) };
|
|
27
|
+
},
|
|
28
|
+
async readRows(hint, options) {
|
|
29
|
+
return this.readRowsByRef({ dbRootId: IQGIT_ROOT_ID, tableName: hint }, options);
|
|
30
|
+
},
|
|
31
|
+
async readRowsByRef(ref, options) {
|
|
32
|
+
const { dbRootId, tableName } = ref;
|
|
33
|
+
const viaGateway = await readRowsByNameViaGateway(dbRootId, tableName, network, options);
|
|
34
|
+
if (viaGateway !== null) return viaGateway;
|
|
35
|
+
return toRows(await iqlabs.reader.readTableRows(dbRootId, tableName, { limit: options?.limit }));
|
|
36
|
+
},
|
|
37
|
+
async readLatestRow(hint) {
|
|
38
|
+
const rows = await this.readRows(hint, { limit: 1 });
|
|
39
|
+
return rows[0] ?? null;
|
|
40
|
+
},
|
|
41
|
+
async signerAddress(signer) {
|
|
42
|
+
return asEth(signer).getAddress();
|
|
43
|
+
},
|
|
44
|
+
async ensureDbRoot(signer, dbRootId = IQGIT_ROOT_ID) {
|
|
45
|
+
try {
|
|
46
|
+
return await iqlabs.writer.initializeDbRoot(asEth(signer), dbRootId);
|
|
47
|
+
} catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
async createTable(signer, hint, columns, idColumn, options) {
|
|
52
|
+
return iqlabs.writer.createTable(
|
|
53
|
+
asEth(signer),
|
|
54
|
+
options?.dbRootId ?? IQGIT_ROOT_ID,
|
|
55
|
+
hint,
|
|
56
|
+
columns,
|
|
57
|
+
idColumn,
|
|
58
|
+
[],
|
|
59
|
+
void 0,
|
|
60
|
+
options?.writers,
|
|
61
|
+
false
|
|
62
|
+
);
|
|
63
|
+
},
|
|
64
|
+
async writeRow(signer, hint, rowJson, dbRootId = IQGIT_ROOT_ID) {
|
|
65
|
+
return iqlabs.writer.writeRow(asEth(signer), dbRootId, hint, rowJson);
|
|
66
|
+
},
|
|
67
|
+
async transferNative(signer, to, amount) {
|
|
68
|
+
const tx = await asEth(signer).sendTransaction({ to, value: BigInt(amount) });
|
|
69
|
+
return (await tx.wait()).hash;
|
|
70
|
+
},
|
|
71
|
+
async tableExists(hint, dbRootId = IQGIT_ROOT_ID) {
|
|
72
|
+
try {
|
|
73
|
+
return await iqlabs.reader.fetchTableMeta(dbRootId, hint) != null;
|
|
74
|
+
} catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
tableRef(hint, dbRootId = IQGIT_ROOT_ID) {
|
|
79
|
+
return { dbRootId, tableName: hint };
|
|
80
|
+
},
|
|
81
|
+
tableKey(hint) {
|
|
82
|
+
return hint;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export { ethAdapter };
|
|
87
|
+
//# sourceMappingURL=eth-BQ57E7OY.js.map
|
|
88
|
+
//# sourceMappingURL=eth-BQ57E7OY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/layers/chain/eth.ts"],"names":[],"mappings":"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","file":"eth-BQ57E7OY.js","sourcesContent":["// L1 — EVM adapter. Same `ChainOps` surface as the Solana adapter, backed by\n// `@iqlabs-official/ethereum-sdk` (the 1:1 EVM port of solana-sdk) over ethers.\n//\n// Differences from the Solana path:\n// • The ethers `Signer` carries its own provider — no `Connection` to hold.\n// • Tables are addressed by `(dbRootId, tableName)`, so `tableRef` is a plain\n// object and there's no PDA derivation.\n// • No client-side chunk pacing: `codeIn` drops the `speed` arg.\n// • Reads go straight through the SDK reader for now; the multi-chain gateway\n// cache is wired in Phase 3.\n//\n// Import-safe: nothing here touches the network at module load — `init()` is\n// the only place the active EVM network is selected.\n\nimport iqlabs from \"@iqlabs-official/ethereum-sdk\";\nimport type { Signer as EthSigner } from \"ethers\";\nimport { IQGIT_ROOT_ID } from \"../../core/seed\";\nimport {\n readCodeInViaGateway,\n readRowsByNameViaGateway,\n setEthGatewayNetwork,\n} from \"../gateway\";\nimport type {\n ChainConfig,\n ChainOps,\n EthNetwork,\n GitSigner,\n ReadOptions,\n Row,\n TableRef,\n} from \"./types\";\n\n/** EVM `TableRef` — the coordinates the SDK reader/writer key off. */\ninterface EthTableRef {\n dbRootId: string;\n tableName: string;\n}\n\n// Active EVM network, set by init(). Reads pass it to the gateway and the\n// gateway pins non-default chains (monad) with `?network=`.\nlet network: EthNetwork = \"sepolia\";\n\nfunction asEth(signer: GitSigner): EthSigner {\n return signer as EthSigner;\n}\n\n// The SDK reader returns `{ txHash, data }[]` with `data` already JSON-parsed;\n// the upper layers want just the row bodies.\nfunction toRows(entries: Array<{ txHash: string; data: unknown }>): Row[] {\n return entries.map((e) => e.data as Row);\n}\n\nexport const ethAdapter: ChainOps = {\n kind: \"eth\",\n\n init(cfg: ChainConfig): void {\n if (cfg.chain !== \"eth\") return;\n network = cfg.network;\n iqlabs.setNetwork(cfg.network, cfg.rpcUrl);\n setEthGatewayNetwork(cfg.network);\n },\n\n async codeIn(\n signer: GitSigner,\n data: string | string[],\n filename: string,\n filetype: string,\n onProgress?: (percent: number) => void,\n ): Promise<string> {\n return iqlabs.writer.codeIn(asEth(signer), data, filename, filetype, onProgress);\n },\n\n async readCodeIn(\n txHash: string,\n ): Promise<{ data: string | null; metadata: string }> {\n const viaGateway = await readCodeInViaGateway(txHash, network);\n if (viaGateway !== null) return viaGateway;\n const { data, metadata } = await iqlabs.reader.readCodeIn(txHash);\n return { data: data ?? null, metadata: JSON.stringify(metadata ?? {}) };\n },\n\n async readRows(hint: string, options?: ReadOptions): Promise<Row[]> {\n return this.readRowsByRef({ dbRootId: IQGIT_ROOT_ID, tableName: hint }, options);\n },\n\n async readRowsByRef(ref: TableRef, options?: ReadOptions): Promise<Row[]> {\n const { dbRootId, tableName } = ref as EthTableRef;\n const viaGateway = await readRowsByNameViaGateway(dbRootId, tableName, network, options);\n if (viaGateway !== null) return viaGateway;\n // EVM reader currently supports `limit` only; `before` is a no-op here.\n return toRows(await iqlabs.reader.readTableRows(dbRootId, tableName, { limit: options?.limit }));\n },\n\n async readLatestRow(hint: string): Promise<Row | null> {\n const rows = await this.readRows(hint, { limit: 1 });\n return rows[0] ?? null;\n },\n\n async signerAddress(signer: GitSigner): Promise<string> {\n return asEth(signer).getAddress();\n },\n\n async ensureDbRoot(signer: GitSigner, dbRootId = IQGIT_ROOT_ID): Promise<string | null> {\n // Idempotent at the SDK level — a revert (already initialized) maps to null.\n try {\n return await iqlabs.writer.initializeDbRoot(asEth(signer), dbRootId);\n } catch {\n return null;\n }\n },\n\n async createTable(\n signer: GitSigner,\n hint: string,\n columns: string[],\n idColumn: string,\n options?: { writers?: string[]; dbRootId?: string },\n ): Promise<string | null> {\n // writers omitted ⇒ open table; array ⇒ restricted. isPrivate=false: git\n // tables are publicly readable. No gate / extKeys for the git namespace.\n return iqlabs.writer.createTable(\n asEth(signer),\n options?.dbRootId ?? IQGIT_ROOT_ID,\n hint,\n columns,\n idColumn,\n [],\n undefined,\n options?.writers,\n false,\n );\n },\n\n async writeRow(\n signer: GitSigner,\n hint: string,\n rowJson: string,\n dbRootId = IQGIT_ROOT_ID,\n ): Promise<string> {\n return iqlabs.writer.writeRow(asEth(signer), dbRootId, hint, rowJson);\n },\n\n async transferNative(\n signer: GitSigner,\n to: string,\n amount: number | bigint,\n ): Promise<string> {\n // Native ETH transfer via ethers — no SDK wrapper needed. `value` is wei.\n const tx = await asEth(signer).sendTransaction({ to, value: BigInt(amount) });\n return (await tx.wait())!.hash;\n },\n\n async tableExists(hint: string, dbRootId = IQGIT_ROOT_ID): Promise<boolean> {\n try {\n return (await iqlabs.reader.fetchTableMeta(dbRootId, hint)) != null;\n } catch {\n return false;\n }\n },\n\n tableRef(hint: string, dbRootId = IQGIT_ROOT_ID): TableRef {\n return { dbRootId, tableName: hint } satisfies EthTableRef;\n },\n\n tableKey(hint: string): string {\n // Multi-chain gateway routes EVM table reads by table name (Phase 3).\n return hint;\n },\n};\n"]}
|
package/dist/node/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { Commit, FileTree, GitClient, GitClientConfig, IQGIT_ROOT_ID, REGISTRY_HINT, RegistryEntry, Repository, SessionSpeed, WriteEvent, bootstrapRegistry, commitTableHint,
|
|
1
|
+
export { Commit, EthClientConfig, EthNetwork, FileTree, GitClient, GitClientConfig, GitSigner, IQGIT_ROOT_ID, IQPAGES_CONFIG_FILENAME, IQPAGES_DEPLOYED_HINT, IQPAGES_PROFILE_FILENAME, IQPAGES_ROOT_ID, NetworkToken, PAGES_FEE_LAMPORTS, PAGES_FEE_RECIPIENT, PAGES_FEE_RECIPIENT_EVM, PAGES_FEE_WEI, PagesConfig, PagesDeployment, PagesProfile, REGISTRY_HINT, RegistryEntry, Repository, SessionSpeed, SolanaClientConfig, SolanaNetwork, TableRef, WriteEvent, bootstrapRegistry, commitTableHint, commitTableRef, deployPages, getGatewayUrls, isPagesDeployed, listPagesDeployments, loadBlob, loadTree, pagesDeployId, pagesTableRef, readCommitHistory, readLatestCommit, readOwnerRepos, readPagesConfig, readPagesProfile, readRegistryPage, repoListHint, setGatewayUrls, setNetwork, uploadBlob, uploadTree, writeCommit } from '../shared/index.js';
|
|
2
2
|
export { DEFAULT_SESSION_SPEED, SESSION_SPEED_PROFILES, SignerInput, resolveSessionSpeed } from '@iqlabs-official/solana-sdk/utils';
|
|
3
3
|
import '@solana/web3.js';
|
|
4
|
+
import 'ethers';
|