@kudo-dev/sdk 0.0.0-stage → 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.ts","../src/abi/kudo.ts","../src/abi/registries.ts","../src/errors.ts","../src/networks.ts","../src/types.ts","../src/dstack.ts"],"sourcesContent":["import {\n createPublicClient,\n decodeEventLog,\n encodeFunctionData,\n formatUnits,\n getAbiItem,\n hexToString,\n http,\n parseEventLogs,\n stringToHex,\n zeroAddress,\n type Abi,\n type Account,\n type Address,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type Hex,\n type PublicClient,\n type TransactionReceipt,\n type WalletClient,\n} from \"viem\";\n\nimport { kudoAbi } from \"./abi/kudo.js\";\nimport { identityRegistryAbi, reputationRegistryAbi } from \"./abi/registries.js\";\nimport { KudoError, toKudoError } from \"./errors.js\";\nimport { resolveNetwork, type KudoNetwork, type NetworkKey } from \"./networks.js\";\nimport {\n COVENANT_TYPES,\n type AgentInfo,\n type AgentRecord,\n type Covenant,\n type CovenantFilter,\n type CovenantStage,\n type CovenantType,\n type MeetAskInput,\n type MintCovenantInput,\n type OpenAskFilter,\n type RegisterAgentInput,\n type TxRequest,\n} from \"./types.js\";\n\nexport interface KudoOptions {\n /** A network key (`\"robinhood\"`) or a full config. Defaults to Robinhood mainnet. */\n network?: NetworkKey | KudoNetwork;\n /** Override any address or setting of the network. */\n overrides?: Partial<KudoNetwork>;\n /** RPC URL. Defaults to the chain's public endpoint. */\n rpcUrl?: string;\n /** Bring your own viem public client instead of `rpcUrl`. */\n publicClient?: PublicClient;\n /**\n * A viem wallet client with an account, for signing. The SDK never stores or\n * asks for a key: leave this out and use the `build*` methods to get\n * unsigned transactions for any signer.\n */\n walletClient?: WalletClient;\n}\n\ntype RawCovenant = {\n agentWallet: Address;\n agentId: bigint;\n status: number;\n nftType: string;\n ask: string;\n covenantPromise: string;\n promiseDetail: string;\n askSettlementData: string;\n askSettledAt: bigint;\n promiseSettlementData: string;\n};\n\nconst toBigInt = (value: bigint | number | string, what: string): bigint => {\n try {\n const n = BigInt(value);\n if (n < 0n) throw new Error();\n return n;\n } catch {\n throw new KudoError(\"INVALID_INPUT\", `${what} must be a non-negative integer, got \"${value}\".`);\n }\n};\n\nexport class Kudo {\n readonly network: KudoNetwork;\n readonly publicClient: PublicClient;\n readonly walletClient?: WalletClient;\n\n constructor(options: KudoOptions = {}) {\n this.network = resolveNetwork(options.network, options.overrides);\n this.publicClient =\n options.publicClient ??\n (createPublicClient({\n chain: this.network.chain,\n transport: http(options.rpcUrl ?? this.network.chain.rpcUrls.default.http[0]),\n }) as PublicClient);\n this.walletClient = options.walletClient;\n }\n\n /** The connected account's address, if a wallet client was given. */\n get address(): Address | undefined {\n return this.walletClient?.account?.address;\n }\n\n get chainId(): number {\n return this.network.chain.id;\n }\n\n /* ------------------------------------------------------------------ reads */\n\n /** One covenant by id. */\n async getCovenant(id: bigint | number | string): Promise<Covenant> {\n const nftId = toBigInt(id, \"Covenant id\");\n try {\n const raw = (await this.publicClient.readContract({\n address: this.network.kudo,\n abi: kudoAbi,\n functionName: \"getCovenant\",\n args: [nftId],\n })) as RawCovenant;\n if (raw.agentWallet === zeroAddress) {\n throw new KudoError(\"NOT_FOUND\", `Covenant ${nftId} does not exist.`);\n }\n return this.toCovenant(nftId, raw);\n } catch (error) {\n if (error instanceof KudoError) throw error;\n throw new KudoError(\"NOT_FOUND\", `Covenant ${nftId} could not be read.`, { cause: error });\n }\n }\n\n /** Every covenant on the contract, newest first, filtered. */\n async listCovenants(filter: CovenantFilter = {}): Promise<Covenant[]> {\n const details = (await this.publicClient.readContract({\n address: this.network.kudo,\n abi: kudoAbi,\n functionName: \"getCovenantsDetails\",\n })) as readonly { nftId: bigint; owner: Address; covenantData: RawCovenant }[];\n\n const stages = filter.stage\n ? new Set(Array.isArray(filter.stage) ? filter.stage : [filter.stage])\n : undefined;\n const agentId = filter.agentId !== undefined ? toBigInt(filter.agentId, \"agentId\") : undefined;\n const wallet = filter.agentWallet?.toLowerCase();\n const type = filter.type?.toUpperCase();\n\n const out = details\n .map((d) => this.toCovenant(d.nftId, d.covenantData, d.owner))\n .filter(\n (c) =>\n (!stages || stages.has(c.stage)) &&\n (agentId === undefined || c.agentId === agentId) &&\n (!wallet || c.agentWallet.toLowerCase() === wallet) &&\n (!type || c.type.toUpperCase() === type),\n )\n .sort((a, b) => (a.id < b.id ? 1 : -1));\n\n return filter.limit ? out.slice(0, filter.limit) : out;\n }\n\n /**\n * Covenants whose ask nobody has met yet: work you can perform and be paid\n * (or repaid) for. First to meet the ask takes it.\n */\n async listOpenAsks(filter: OpenAskFilter = {}): Promise<Covenant[]> {\n const exclude = (filter.excludeWallet ?? this.address)?.toLowerCase();\n const open = await this.listCovenants({\n stage: \"ask-open\",\n type: filter.type,\n agentId: filter.agentId,\n });\n const mine = (c: Covenant) => !!exclude && c.agentWallet.toLowerCase() === exclude;\n const out = open.filter((c) => !mine(c));\n return filter.limit ? out.slice(0, filter.limit) : out;\n }\n\n /** Identity facts for one ERC-8004 id. */\n async getAgent(agentId: bigint | number | string): Promise<AgentInfo> {\n const id = toBigInt(agentId, \"agentId\");\n const registry = this.network.identityRegistry;\n let owner: Address;\n try {\n owner = await this.publicClient.readContract({\n address: registry,\n abi: identityRegistryAbi,\n functionName: \"ownerOf\",\n args: [id],\n });\n } catch (error) {\n throw new KudoError(\"NOT_FOUND\", `Agent ${id} is not registered on ${this.network.chain.name}.`, {\n cause: error,\n });\n }\n const meta = async (key: string) => {\n try {\n const bytes = await this.publicClient.readContract({\n address: registry,\n abi: identityRegistryAbi,\n functionName: \"getMetadata\",\n args: [id, key],\n });\n return bytes && bytes !== \"0x\" ? hexToString(bytes) : null;\n } catch {\n return null;\n }\n };\n const uri = await this.publicClient\n .readContract({ address: registry, abi: identityRegistryAbi, functionName: \"tokenURI\", args: [id] })\n .then((u) => u || null)\n .catch(() => null);\n const [name, teeId] = await Promise.all([meta(\"name\"), meta(\"teeId\")]);\n return { agentId: id, owner, name, teeId, uri };\n }\n\n /** An agent's identity plus its kept-vs-broken covenant record. */\n async agentRecord(agentId: bigint | number | string): Promise<AgentRecord> {\n const info = await this.getAgent(agentId);\n const all = await this.listCovenants({ agentId: info.agentId });\n // An id on a covenant is only meaningful when the wallet that minted it\n // owns the id; on older deployments anyone could write any number.\n const covenants = all.filter((c) => c.agentWallet.toLowerCase() === info.owner.toLowerCase());\n const count = (stage: CovenantStage) => covenants.filter((c) => c.stage === stage).length;\n return {\n ...info,\n covenants: {\n total: covenants.length,\n kept: count(\"completed\"),\n broken: count(\"failed\"),\n open: covenants.length - count(\"completed\") - count(\"failed\"),\n },\n reputation: await this.reputation(info.agentId),\n recent: covenants.slice(0, 10),\n };\n }\n\n private async reputation(agentId: bigint): Promise<AgentRecord[\"reputation\"]> {\n const registry = this.network.reputationRegistry;\n if (!registry) return null;\n try {\n const clients = await this.publicClient.readContract({\n address: registry,\n abi: reputationRegistryAbi,\n functionName: \"getClients\",\n args: [agentId],\n });\n if (!clients.length) return null;\n const [count, value, decimals] = await this.publicClient.readContract({\n address: registry,\n abi: reputationRegistryAbi,\n functionName: \"getSummary\",\n args: [agentId, clients, \"\", \"\"],\n });\n return { count: Number(count), value: Number(value) / 10 ** decimals };\n } catch {\n return null;\n }\n }\n\n /**\n * The ERC-8004 ids a wallet owns, oldest first.\n *\n * The registry has no reverse lookup, so this reads `Registered` events\n * filtered on `owner` and `Transfer` events filtered on `to` (ids sent to\n * the wallet), walking back one RPC-sized window at a time until it has\n * found as many currently owned ids as `balanceOf` says exist.\n */\n async findAgentIds(wallet?: Address, options: { maxWindows?: number } = {}): Promise<bigint[]> {\n const owner = wallet ?? this.address;\n if (!owner) throw new KudoError(\"NO_WALLET\", \"Pass a wallet address or connect a wallet.\");\n const registry = this.network.identityRegistry;\n\n const balance = await this.publicClient.readContract({\n address: registry,\n abi: identityRegistryAbi,\n functionName: \"balanceOf\",\n args: [owner],\n });\n if (balance === 0n) return [];\n\n const registered = getAbiItem({ abi: identityRegistryAbi, name: \"Registered\" });\n const transfer = getAbiItem({ abi: identityRegistryAbi, name: \"Transfer\" });\n // Registered names the first owner and Transfer a past recipient; either\n // may since have moved the id on, so every candidate is checked once.\n const checked = new Map<bigint, boolean>();\n const owns = (id: bigint) =>\n this.publicClient\n .readContract({ address: registry, abi: identityRegistryAbi, functionName: \"ownerOf\", args: [id] })\n .then((o) => o.toLowerCase() === owner.toLowerCase())\n .catch(() => false);\n const ownedCount = () => BigInt([...checked.values()].filter(Boolean).length);\n\n const range = this.network.maxLogRange;\n let to = await this.publicClient.getBlockNumber();\n for (let i = 0; i < (options.maxWindows ?? 20) && to >= 0n; i++) {\n const from = to > range ? to - range + 1n : 0n;\n const [minted, received] = await Promise.all([\n this.publicClient.getLogs({ address: registry, event: registered, args: { owner }, fromBlock: from, toBlock: to }),\n this.publicClient.getLogs({ address: registry, event: transfer, args: { to: owner }, fromBlock: from, toBlock: to }),\n ]);\n const candidates = new Set<bigint>();\n for (const log of minted) if (log.args.agentId !== undefined) candidates.add(log.args.agentId);\n for (const log of received) if (log.args.tokenId !== undefined) candidates.add(log.args.tokenId);\n const fresh = [...candidates].filter((id) => !checked.has(id));\n const results = await Promise.all(fresh.map(owns));\n fresh.forEach((id, j) => checked.set(id, results[j]!));\n if (ownedCount() >= balance || from === 0n) break;\n to = from - 1n;\n }\n\n return [...checked].filter(([, owned]) => owned).map(([id]) => id).sort((a, b) => (a < b ? -1 : 1));\n }\n\n /** ETH balance (gas) as a decimal string. */\n async ethBalance(wallet?: Address): Promise<string> {\n const who = wallet ?? this.address;\n if (!who) throw new KudoError(\"NO_WALLET\", \"Pass a wallet address or connect a wallet.\");\n return formatUnits(await this.publicClient.getBalance({ address: who }), 18);\n }\n\n /**\n * The contract's ask cooldown setting, in seconds. Note: on the current\n * mainnet contract it does not stop a second `setAskSettlementData` from\n * replacing an earlier claim (tested on a fork), so never rely on it to\n * protect a claim; `meetAsk` checks before and after instead.\n */\n async getAskCooldown(): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: this.network.kudo,\n abi: kudoAbi,\n functionName: \"getAskCooldown\",\n })) as bigint;\n }\n\n /**\n * Throws unless a covenant is waiting for its promise proof: the Evaluator\n * has accepted the claim on its ask (status IN_PROGRESS) and no promise\n * proof is linked yet. A claim alone does not make the promise due, and\n * linking twice replaces the first proof.\n */\n assertPromiseDue(covenant: Covenant): void {\n if (covenant.stage === \"completed\" || covenant.stage === \"failed\") {\n throw new KudoError(\"INVALID_INPUT\", `Covenant ${covenant.id} is already closed as ${covenant.stage}.`);\n }\n if (covenant.promiseProof) {\n throw new KudoError(\"ALREADY_PROVEN\", `Covenant ${covenant.id} already has promise proof ${covenant.promiseProof}. Do not pay or link again.`);\n }\n if (covenant.status !== \"IN_PROGRESS\") {\n throw new KudoError(\n \"ASK_NOT_MET\",\n covenant.askSettledAt\n ? `Covenant ${covenant.id}'s ask has been claimed but the Evaluator has not accepted it yet (status ${covenant.status}), so nothing is owed. Do not pay; wait for status IN_PROGRESS.`\n : `Covenant ${covenant.id}'s ask has not been met yet, so there is no promise to keep.`,\n );\n }\n }\n\n /* --------------------------------------------------------------- builders */\n\n /** Encodes any call on a Kudo or registry contract as an unsigned transaction. */\n buildTx<\n const abi extends Abi,\n functionName extends ContractFunctionName<abi, \"nonpayable\" | \"payable\">,\n >(call: {\n address: Address;\n abi: abi;\n functionName: functionName;\n args: ContractFunctionArgs<abi, \"nonpayable\" | \"payable\", functionName>;\n value?: bigint;\n description: string;\n }): TxRequest {\n return {\n to: call.address,\n data: encodeFunctionData({ abi: call.abi, functionName: call.functionName, args: call.args } as never),\n value: call.value ?? 0n,\n chainId: this.chainId,\n description: call.description,\n };\n }\n\n /** The mint transaction. Validates the text first; does not check ownership (see `mintCovenant`). */\n buildMintCovenant(input: MintCovenantInput): TxRequest {\n const agentId = toBigInt(input.agentId, \"agentId\");\n const type = String(input.type).toUpperCase() as CovenantType;\n if (!COVENANT_TYPES.includes(type)) {\n throw new KudoError(\n \"INVALID_INPUT\",\n `type must be one of ${COVENANT_TYPES.join(\", \")}; got \"${input.type}\". Work on account is an INVOICE; money up front for later work is an ADVANCE.`,\n );\n }\n const ask = input.ask?.trim();\n const promise = input.promise?.trim();\n if (!ask) throw new KudoError(\"INVALID_INPUT\", \"ask is required: what the counterparty does.\");\n if (!promise) throw new KudoError(\"INVALID_INPUT\", \"promise is required: what you do in return.\");\n return this.buildTx({\n address: this.network.kudo,\n abi: kudoAbi,\n functionName: \"mintCovenant\",\n // The contract takes the promise before the ask.\n args: [agentId, promise, ask, type],\n description: `Mint a ${type} covenant under agent ${agentId}. Ask: \"${ask}\". Promise: \"${promise}\".`,\n });\n }\n\n /** The transaction a counterparty sends after performing a covenant's ask. */\n buildMeetAsk(id: bigint | number | string, input: MeetAskInput): TxRequest {\n const nftId = toBigInt(id, \"Covenant id\");\n const proof = input.proof?.trim();\n if (!proof) throw new KudoError(\"INVALID_INPUT\", \"proof is required: a tx hash or a URL showing the ask was met.\");\n return this.buildTx({\n address: this.network.kudo,\n abi: kudoAbi,\n functionName: \"setAskSettlementData\",\n args: [nftId, proof, input.promiseDetail?.trim() ?? \"\"],\n description: `Meet the ask of covenant ${nftId} with proof ${proof}${input.promiseDetail ? ` and payment instruction \"${input.promiseDetail}\"` : \"\"}.`,\n });\n }\n\n /** The transaction the promiser sends after keeping the promise. */\n buildLinkProof(id: bigint | number | string, proof: string): TxRequest {\n const nftId = toBigInt(id, \"Covenant id\");\n const value = proof?.trim();\n if (!value) throw new KudoError(\"INVALID_INPUT\", \"proof is required: a tx hash or a URL showing the promise was kept.\");\n return this.buildTx({\n address: this.network.kudo,\n abi: kudoAbi,\n functionName: \"setPromiseSettlementData\",\n args: [nftId, value],\n description: `Link proof ${value} that the promise of covenant ${nftId} was kept.`,\n });\n }\n\n /** Registers a new ERC-8004 identity owned by the signer. */\n buildRegisterAgent(input: RegisterAgentInput): TxRequest {\n const name = input.name?.trim();\n if (!name) throw new KudoError(\"INVALID_INPUT\", \"name is required.\");\n const metadata = Object.entries({ name, ...(input.metadata ?? {}) }).map(([metadataKey, value]) => ({\n metadataKey,\n metadataValue: stringToHex(value),\n }));\n return this.buildTx({\n address: this.network.identityRegistry,\n abi: identityRegistryAbi,\n functionName: \"register\",\n args: [input.uri ?? \"\", metadata],\n description: `Register an ERC-8004 agent identity named \"${name}\".`,\n });\n }\n\n /** Sets one metadata entry (e.g. `teeId`, `endpoint`, `name`) on an ERC-8004 identity. */\n buildSetAgentMetadata(agentId: bigint | number | string, key: string, value: string): TxRequest {\n const id = toBigInt(agentId, \"agentId\");\n const k = key?.trim();\n if (!k) throw new KudoError(\"INVALID_INPUT\", \"key is required.\");\n return this.buildTx({\n address: this.network.identityRegistry,\n abi: identityRegistryAbi,\n functionName: \"setMetadata\",\n args: [id, k, stringToHex(value ?? \"\")],\n description: `Set \"${k}\" to \"${value}\" on agent ${id}.`,\n });\n }\n\n /* ------------------------------------------------------------------ sends */\n\n private requireWallet(): { wallet: WalletClient; account: Account } {\n const wallet = this.walletClient;\n const account = wallet?.account;\n if (!wallet || !account) {\n throw new KudoError(\n \"NO_WALLET\",\n \"This needs a signer. Pass a viem walletClient with an account to createKudo, or use the build* method and sign the transaction yourself.\",\n );\n }\n return { wallet, account };\n }\n\n /**\n * Simulates, signs, sends and waits for one transaction. Throws a KudoError\n * naming the revert if the simulation or the receipt fails.\n */\n async send(tx: TxRequest): Promise<TransactionReceipt> {\n const { wallet, account } = this.requireWallet();\n await this.simulate(tx, account.address);\n let hash: Hex;\n try {\n hash = await wallet.sendTransaction({\n account,\n chain: this.network.chain,\n to: tx.to,\n data: tx.data,\n value: tx.value,\n });\n } catch (error) {\n throw toKudoError(error, tx.description);\n }\n // One send at a time per key: blocks here come every ~0.2s and a second\n // send before the receipt lands collides on the nonce.\n const receipt = await this.publicClient.waitForTransactionReceipt({ hash });\n if (receipt.status !== \"success\") {\n throw new KudoError(\"TX_FAILED\", `${tx.description} — transaction ${hash} reverted.`);\n }\n return receipt;\n }\n\n /**\n * Dry-runs a transaction as `from` without signing anything. Throws a\n * KudoError naming the revert, so a bad mint costs nothing.\n */\n async simulate(tx: TxRequest, from: Address): Promise<void> {\n try {\n await this.publicClient.call({ account: from, to: tx.to, data: tx.data, value: tx.value });\n } catch (error) {\n throw toKudoError(error, tx.description);\n }\n }\n\n /** Broadcasts a transaction someone already signed. For agents that sign offline. */\n async sendRawTransaction(serialized: Hex): Promise<{ hash: Hex; status: \"success\" | \"reverted\" }> {\n try {\n const hash = await this.publicClient.sendRawTransaction({ serializedTransaction: serialized });\n const receipt = await this.publicClient.waitForTransactionReceipt({ hash });\n return { hash, status: receipt.status };\n } catch (error) {\n throw toKudoError(error, \"Broadcasting the signed transaction\");\n }\n }\n\n /**\n * Mints a covenant and returns its id.\n *\n * Checks first that the signer owns `agentId`: the contract refuses a mint\n * under an id the caller does not control, and a mint is permanent — a\n * second attempt adds a duplicate rather than replacing the first.\n */\n async mintCovenant(input: MintCovenantInput): Promise<{ hash: Hex; covenantId: bigint; url?: string }> {\n const { account } = this.requireWallet();\n const tx = this.buildMintCovenant(input);\n const agentId = toBigInt(input.agentId, \"agentId\");\n const owner = await this.getAgent(agentId).then((a) => a.owner);\n if (owner.toLowerCase() !== account.address.toLowerCase()) {\n throw new KudoError(\n \"NOT_AGENT_OWNER\",\n `Agent ${agentId} belongs to ${owner}, not ${account.address}. Mint under an id this wallet owns.`,\n );\n }\n const receipt = await this.send(tx);\n const covenantId = this.mintedId(receipt);\n return { hash: receipt.transactionHash, covenantId, url: this.covenantUrl(covenantId) };\n }\n\n /** Reads the new covenant id out of a mint receipt. */\n mintedId(receipt: TransactionReceipt): bigint {\n const kudo = this.network.kudo.toLowerCase();\n const minted = parseEventLogs({ abi: kudoAbi, eventName: \"CovenantMinted\", logs: receipt.logs }).find(\n (l) => l.address.toLowerCase() === kudo,\n );\n if (minted) return (minted.args as { nftId: bigint }).nftId;\n for (const log of receipt.logs) {\n if (log.address.toLowerCase() !== kudo) continue;\n try {\n const e = decodeEventLog({ abi: kudoAbi, data: log.data, topics: log.topics });\n if (e.eventName === \"Transfer\" && (e.args as { from: Address }).from === zeroAddress) {\n return (e.args as unknown as { tokenId: bigint }).tokenId;\n }\n } catch {\n /* not one of ours */\n }\n }\n throw new KudoError(\"NOT_FOUND\", `Transaction ${receipt.transactionHash} minted no covenant.`);\n }\n\n /**\n * Meets a covenant's ask: you did the work (or sent the money), now record\n * the proof. Refuses if someone already met it — attesting over them would\n * overwrite their claim (the contract does not prevent that) and restart\n * the promiser's clock. After mining it re-reads the\n * covenant and throws ALREADY_MET if the proof on chain is not yours.\n */\n async meetAsk(id: bigint | number | string, input: MeetAskInput): Promise<{ hash: Hex }> {\n const { account } = this.requireWallet();\n const tx = this.buildMeetAsk(id, input);\n const covenant = await this.getCovenant(id);\n if (covenant.askSettledAt) {\n throw new KudoError(\"ALREADY_MET\", `Covenant ${covenant.id}'s ask was already met at ${covenant.askSettledAt.toISOString()} with ${covenant.askProof}.`);\n }\n if (covenant.stage !== \"ask-open\") {\n throw new KudoError(\"ALREADY_MET\", `Covenant ${covenant.id} is ${covenant.status} (${covenant.stage}); its ask is no longer open.`);\n }\n if (covenant.agentWallet.toLowerCase() === account.address.toLowerCase()) {\n throw new KudoError(\"INVALID_INPUT\", `You minted covenant ${covenant.id}; you cannot be your own counterparty.`);\n }\n const receipt = await this.send(tx);\n // Another agent may have met it between the read above and this block.\n const after = await this.getCovenant(id);\n if (after.askProof !== input.proof.trim()) {\n throw new KudoError(\n \"ALREADY_MET\",\n `Transaction ${receipt.transactionHash} was mined, but covenant ${after.id}'s ask now carries ${after.askProof}, not your proof: another agent met it first.`,\n );\n }\n return { hash: receipt.transactionHash };\n }\n\n /**\n * Links proof that you kept your promise. Only the covenant's agentWallet\n * may, only once its ask is met, and only once.\n */\n async linkProof(id: bigint | number | string, proof: string): Promise<{ hash: Hex }> {\n const { account } = this.requireWallet();\n const tx = this.buildLinkProof(id, proof);\n const covenant = await this.getCovenant(id);\n if (covenant.agentWallet.toLowerCase() !== account.address.toLowerCase()) {\n throw new KudoError(\"NOT_PROMISER\", `Covenant ${covenant.id}'s promise is owed by ${covenant.agentWallet}; only that wallet can link its proof.`);\n }\n this.assertPromiseDue(covenant);\n const receipt = await this.send(tx);\n return { hash: receipt.transactionHash };\n }\n\n /**\n * Registers an ERC-8004 identity and returns its id. Refuses if the wallet\n * already has one, because a second registration cannot be undone; pass\n * `allowAnother` to register anyway.\n */\n async registerAgent(input: RegisterAgentInput & { allowAnother?: boolean }): Promise<{ hash: Hex; agentId: bigint }> {\n const { account } = this.requireWallet();\n const tx = this.buildRegisterAgent(input);\n if (!input.allowAnother) {\n const balance = await this.publicClient.readContract({\n address: this.network.identityRegistry,\n abi: identityRegistryAbi,\n functionName: \"balanceOf\",\n args: [account.address],\n });\n if (balance > 0n) {\n throw new KudoError(\n \"ALREADY_REGISTERED\",\n `${account.address} already owns ${balance} agent identit${balance === 1n ? \"y\" : \"ies\"}. Use findAgentIds() to recover the id.`,\n );\n }\n }\n const receipt = await this.send(tx);\n const registered = parseEventLogs({ abi: identityRegistryAbi, eventName: \"Registered\", logs: receipt.logs })[0];\n if (!registered) throw new KudoError(\"NOT_FOUND\", `Transaction ${receipt.transactionHash} registered no identity.`);\n return { hash: receipt.transactionHash, agentId: registered.args.agentId };\n }\n\n /**\n * Sets one metadata entry on an identity this wallet owns. Refuses an id\n * owned by anyone else before anything is signed.\n */\n async setAgentMetadata(agentId: bigint | number | string, key: string, value: string): Promise<{ hash: Hex }> {\n const { account } = this.requireWallet();\n const tx = this.buildSetAgentMetadata(agentId, key, value);\n const id = toBigInt(agentId, \"agentId\");\n const owner = (await this.getAgent(id)).owner;\n if (owner.toLowerCase() !== account.address.toLowerCase()) {\n throw new KudoError(\"NOT_AGENT_OWNER\", `Agent ${id} belongs to ${owner}, not ${account.address}.`);\n }\n const receipt = await this.send(tx);\n return { hash: receipt.transactionHash };\n }\n\n /**\n * Resolves when a covenant reaches `until` (default: closed, i.e. completed\n * or failed). Polls, so it works on any RPC.\n */\n async watchSettlement(\n id: bigint | number | string,\n options: {\n until?: CovenantStage[];\n intervalMs?: number;\n timeoutMs?: number;\n signal?: AbortSignal;\n onChange?: (covenant: Covenant) => void;\n } = {},\n ): Promise<Covenant> {\n const until = new Set(options.until ?? [\"completed\", \"failed\"]);\n const interval = options.intervalMs ?? 5_000;\n const deadline = options.timeoutMs ? Date.now() + options.timeoutMs : Infinity;\n let last: CovenantStage | undefined;\n for (;;) {\n if (options.signal?.aborted) throw new KudoError(\"TIMEOUT\", \"Watching was cancelled.\");\n const covenant = await this.getCovenant(id);\n if (covenant.stage !== last) {\n last = covenant.stage;\n options.onChange?.(covenant);\n }\n if (until.has(covenant.stage)) return covenant;\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new KudoError(\"TIMEOUT\", `Covenant ${covenant.id} is still ${covenant.stage}.`);\n }\n // Sleep until the next poll or the deadline, whichever is first, so the\n // last read lands at the deadline; an abort wakes the sleep at once.\n await new Promise<void>((resolve) => {\n const done = () => {\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", done);\n resolve();\n };\n const timer = setTimeout(done, Math.min(interval, remaining));\n options.signal?.addEventListener(\"abort\", done, { once: true });\n });\n }\n }\n\n /* ---------------------------------------------------------------- helpers */\n\n covenantUrl(id: bigint): string | undefined {\n return this.network.covenantUrl?.replace(\"{id}\", id.toString());\n }\n\n txUrl(hash: Hex): string {\n return `${this.network.explorerUrl}/tx/${hash}`;\n }\n\n private toCovenant(id: bigint, raw: RawCovenant, owner?: Address): Covenant {\n const status = this.network.statuses[raw.status] ?? \"MINTED\";\n const askSettledAt = raw.askSettledAt > 0n ? new Date(Number(raw.askSettledAt) * 1000) : null;\n // Only the Evaluator makes a promise due, by setting IN_PROGRESS once it\n // has accepted the claim on the ask. A claim alone is \"ask-claimed\".\n const stage: CovenantStage =\n status === \"FAILED\"\n ? \"failed\"\n : status === \"COMPLETED\"\n ? \"completed\"\n : raw.promiseSettlementData\n ? \"awaiting-evaluation\"\n : status === \"IN_PROGRESS\"\n ? \"promise-due\"\n : askSettledAt\n ? \"ask-claimed\"\n : \"ask-open\";\n return {\n id,\n owner,\n agentWallet: raw.agentWallet,\n agentId: raw.agentId,\n status,\n stage,\n type: raw.nftType,\n ask: raw.ask,\n promise: raw.covenantPromise,\n promiseDetail: raw.promiseDetail,\n askProof: raw.askSettlementData,\n askSettledAt,\n promiseProof: raw.promiseSettlementData,\n url: this.covenantUrl(id),\n };\n }\n}\n\n/** Creates a Kudo client. With no options it reads Robinhood Chain mainnet. */\nexport function createKudo(options: KudoOptions = {}): Kudo {\n return new Kudo(options);\n}\n","// Generated from the Kudo contract (kudo-erc-8004) as deployed on Robinhood Chain.\n// Copied from kudo-client/src/lib/abi/kudo.ts. Regenerate from the contract\n// rather than editing by hand when the proxy is upgraded.\nexport const kudoAbi = [\n {\n type: \"constructor\",\n inputs: [\n {\n name: \"admin\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"initialDelay\",\n type: \"uint48\",\n internalType: \"uint48\",\n },\n {\n name: \"mintAccessControl\",\n type: \"bool\",\n internalType: \"bool\",\n },\n {\n name: \"askCooldown\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"AGENT_ROLE\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"DEFAULT_ADMIN_ROLE\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"EVALUATOR_CONTRACT_ROLE\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"acceptDefaultAdminTransfer\",\n inputs: [],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"approve\",\n inputs: [\n {\n name: \"to\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"tokenId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"balanceOf\",\n inputs: [\n {\n name: \"owner\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"beginDefaultAdminTransfer\",\n inputs: [\n {\n name: \"newAdmin\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"cancelDefaultAdminTransfer\",\n inputs: [],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"changeDefaultAdminDelay\",\n inputs: [\n {\n name: \"newDelay\",\n type: \"uint48\",\n internalType: \"uint48\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"defaultAdmin\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"defaultAdminDelay\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"uint48\",\n internalType: \"uint48\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"defaultAdminDelayIncreaseWait\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"uint48\",\n internalType: \"uint48\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"getAgentCovenantIds\",\n inputs: [\n {\n name: \"agent\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"uint256[]\",\n internalType: \"uint256[]\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"getAgentCovenantsData\",\n inputs: [\n {\n name: \"agent\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"tuple[]\",\n internalType: \"struct Kudo.CovenantData[]\",\n components: [\n {\n name: \"agentWallet\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"agentId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"status\",\n type: \"uint8\",\n internalType: \"enum Kudo.CovenantStatus\",\n },\n {\n name: \"nftType\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"ask\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"covenantPromise\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"promiseDetail\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"askSettlementData\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"askSettledAt\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"promiseSettlementData\",\n type: \"string\",\n internalType: \"string\",\n },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"getApproved\",\n inputs: [\n {\n name: \"tokenId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"getAskCooldown\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"getCovenant\",\n inputs: [\n {\n name: \"nftId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n internalType: \"struct Kudo.CovenantData\",\n components: [\n {\n name: \"agentWallet\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"agentId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"status\",\n type: \"uint8\",\n internalType: \"enum Kudo.CovenantStatus\",\n },\n {\n name: \"nftType\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"ask\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"covenantPromise\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"promiseDetail\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"askSettlementData\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"askSettledAt\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"promiseSettlementData\",\n type: \"string\",\n internalType: \"string\",\n },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"getCovenantDetails\",\n inputs: [\n {\n name: \"nftId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n internalType: \"struct Kudo.CovenantDetails\",\n components: [\n {\n name: \"nftId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"owner\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"covenantData\",\n type: \"tuple\",\n internalType: \"struct Kudo.CovenantData\",\n components: [\n {\n name: \"agentWallet\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"agentId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"status\",\n type: \"uint8\",\n internalType: \"enum Kudo.CovenantStatus\",\n },\n {\n name: \"nftType\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"ask\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"covenantPromise\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"promiseDetail\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"askSettlementData\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"askSettledAt\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"promiseSettlementData\",\n type: \"string\",\n internalType: \"string\",\n },\n ],\n },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"getCovenantsDetails\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"tuple[]\",\n internalType: \"struct Kudo.CovenantDetails[]\",\n components: [\n {\n name: \"nftId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"owner\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"covenantData\",\n type: \"tuple\",\n internalType: \"struct Kudo.CovenantData\",\n components: [\n {\n name: \"agentWallet\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"agentId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"status\",\n type: \"uint8\",\n internalType: \"enum Kudo.CovenantStatus\",\n },\n {\n name: \"nftType\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"ask\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"covenantPromise\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"promiseDetail\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"askSettlementData\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"askSettledAt\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"promiseSettlementData\",\n type: \"string\",\n internalType: \"string\",\n },\n ],\n },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"getCovenantsWithStatus\",\n inputs: [\n {\n name: \"status\",\n type: \"uint8\",\n internalType: \"enum Kudo.CovenantStatus\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"tuple[]\",\n internalType: \"struct Kudo.CovenantData[]\",\n components: [\n {\n name: \"agentWallet\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"agentId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"status\",\n type: \"uint8\",\n internalType: \"enum Kudo.CovenantStatus\",\n },\n {\n name: \"nftType\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"ask\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"covenantPromise\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"promiseDetail\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"askSettlementData\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"askSettledAt\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"promiseSettlementData\",\n type: \"string\",\n internalType: \"string\",\n },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"getRoleAdmin\",\n inputs: [\n {\n name: \"role\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"getTotalCovenants\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"grantRole\",\n inputs: [\n {\n name: \"role\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n {\n name: \"account\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"hasRole\",\n inputs: [\n {\n name: \"role\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n {\n name: \"account\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"bool\",\n internalType: \"bool\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"isApprovedForAll\",\n inputs: [\n {\n name: \"owner\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"operator\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"bool\",\n internalType: \"bool\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"isAskSettled\",\n inputs: [\n {\n name: \"nftId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"bool\",\n internalType: \"bool\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"isMintAccessControlEnabled\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"bool\",\n internalType: \"bool\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"mintCovenant\",\n inputs: [\n {\n name: \"agentId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"covenantPromise\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"ask\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"nftType\",\n type: \"string\",\n internalType: \"string\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"name\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"string\",\n internalType: \"string\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"owner\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"ownerOf\",\n inputs: [\n {\n name: \"tokenId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"pendingDefaultAdmin\",\n inputs: [],\n outputs: [\n {\n name: \"newAdmin\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"schedule\",\n type: \"uint48\",\n internalType: \"uint48\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"pendingDefaultAdminDelay\",\n inputs: [],\n outputs: [\n {\n name: \"newDelay\",\n type: \"uint48\",\n internalType: \"uint48\",\n },\n {\n name: \"schedule\",\n type: \"uint48\",\n internalType: \"uint48\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"renounceRole\",\n inputs: [\n {\n name: \"role\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n {\n name: \"account\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"revokeRole\",\n inputs: [\n {\n name: \"role\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n {\n name: \"account\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"rollbackDefaultAdminDelay\",\n inputs: [],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"safeTransferFrom\",\n inputs: [\n {\n name: \"from\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"to\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"tokenId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"safeTransferFrom\",\n inputs: [\n {\n name: \"from\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"to\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"tokenId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"data\",\n type: \"bytes\",\n internalType: \"bytes\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"setApprovalForAll\",\n inputs: [\n {\n name: \"operator\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"approved\",\n type: \"bool\",\n internalType: \"bool\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"setAskCooldown\",\n inputs: [\n {\n name: \"cooldownSeconds\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"setAskSettlementData\",\n inputs: [\n {\n name: \"nftId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"settlementData\",\n type: \"string\",\n internalType: \"string\",\n },\n {\n name: \"promiseDetail\",\n type: \"string\",\n internalType: \"string\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"setCovenantStatus\",\n inputs: [\n {\n name: \"nftId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"status\",\n type: \"uint8\",\n internalType: \"enum Kudo.CovenantStatus\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"setMintAccessControl\",\n inputs: [\n {\n name: \"enabled\",\n type: \"bool\",\n internalType: \"bool\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"setPromiseSettlementData\",\n inputs: [\n {\n name: \"nftId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"data\",\n type: \"string\",\n internalType: \"string\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"supportsInterface\",\n inputs: [\n {\n name: \"interfaceId\",\n type: \"bytes4\",\n internalType: \"bytes4\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"bool\",\n internalType: \"bool\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"symbol\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"string\",\n internalType: \"string\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"tokenURI\",\n inputs: [\n {\n name: \"tokenId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"string\",\n internalType: \"string\",\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"transferFrom\",\n inputs: [\n {\n name: \"from\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"to\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"tokenId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"event\",\n name: \"Approval\",\n inputs: [\n {\n name: \"owner\",\n type: \"address\",\n indexed: true,\n internalType: \"address\",\n },\n {\n name: \"approved\",\n type: \"address\",\n indexed: true,\n internalType: \"address\",\n },\n {\n name: \"tokenId\",\n type: \"uint256\",\n indexed: true,\n internalType: \"uint256\",\n },\n ],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"ApprovalForAll\",\n inputs: [\n {\n name: \"owner\",\n type: \"address\",\n indexed: true,\n internalType: \"address\",\n },\n {\n name: \"operator\",\n type: \"address\",\n indexed: true,\n internalType: \"address\",\n },\n {\n name: \"approved\",\n type: \"bool\",\n indexed: false,\n internalType: \"bool\",\n },\n ],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"AskCooldownSet\",\n inputs: [\n {\n name: \"cooldownSeconds\",\n type: \"uint256\",\n indexed: false,\n internalType: \"uint256\",\n },\n ],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"AskSettlementSet\",\n inputs: [\n {\n name: \"nftId\",\n type: \"uint256\",\n indexed: false,\n internalType: \"uint256\",\n },\n {\n name: \"askSettlement\",\n type: \"string\",\n indexed: false,\n internalType: \"string\",\n },\n {\n name: \"promiseDetails\",\n type: \"string\",\n indexed: false,\n internalType: \"string\",\n },\n ],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"CovenantMinted\",\n inputs: [\n {\n name: \"nftId\",\n type: \"uint256\",\n indexed: false,\n internalType: \"uint256\",\n },\n {\n name: \"agent\",\n type: \"address\",\n indexed: true,\n internalType: \"address\",\n },\n {\n name: \"nftType\",\n type: \"string\",\n indexed: false,\n internalType: \"string\",\n },\n {\n name: \"covenantPromise\",\n type: \"string\",\n indexed: false,\n internalType: \"string\",\n },\n {\n name: \"ask\",\n type: \"string\",\n indexed: false,\n internalType: \"string\",\n },\n ],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"CovenantPromiseSet\",\n inputs: [\n {\n name: \"nftId\",\n type: \"uint256\",\n indexed: true,\n internalType: \"uint256\",\n },\n {\n name: \"status\",\n type: \"uint8\",\n indexed: false,\n internalType: \"enum Kudo.CovenantStatus\",\n },\n ],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"DefaultAdminDelayChangeCanceled\",\n inputs: [],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"DefaultAdminDelayChangeScheduled\",\n inputs: [\n {\n name: \"newDelay\",\n type: \"uint48\",\n indexed: false,\n internalType: \"uint48\",\n },\n {\n name: \"effectSchedule\",\n type: \"uint48\",\n indexed: false,\n internalType: \"uint48\",\n },\n ],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"DefaultAdminTransferCanceled\",\n inputs: [],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"DefaultAdminTransferScheduled\",\n inputs: [\n {\n name: \"newAdmin\",\n type: \"address\",\n indexed: true,\n internalType: \"address\",\n },\n {\n name: \"acceptSchedule\",\n type: \"uint48\",\n indexed: false,\n internalType: \"uint48\",\n },\n ],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"MintAccessControlSet\",\n inputs: [\n {\n name: \"enabled\",\n type: \"bool\",\n indexed: false,\n internalType: \"bool\",\n },\n ],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"PromiseSettlementSet\",\n inputs: [\n {\n name: \"nftId\",\n type: \"uint256\",\n indexed: false,\n internalType: \"uint256\",\n },\n {\n name: \"promiseSettlement\",\n type: \"string\",\n indexed: false,\n internalType: \"string\",\n },\n ],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"RoleAdminChanged\",\n inputs: [\n {\n name: \"role\",\n type: \"bytes32\",\n indexed: true,\n internalType: \"bytes32\",\n },\n {\n name: \"previousAdminRole\",\n type: \"bytes32\",\n indexed: true,\n internalType: \"bytes32\",\n },\n {\n name: \"newAdminRole\",\n type: \"bytes32\",\n indexed: true,\n internalType: \"bytes32\",\n },\n ],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"RoleGranted\",\n inputs: [\n {\n name: \"role\",\n type: \"bytes32\",\n indexed: true,\n internalType: \"bytes32\",\n },\n {\n name: \"account\",\n type: \"address\",\n indexed: true,\n internalType: \"address\",\n },\n {\n name: \"sender\",\n type: \"address\",\n indexed: true,\n internalType: \"address\",\n },\n ],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"RoleRevoked\",\n inputs: [\n {\n name: \"role\",\n type: \"bytes32\",\n indexed: true,\n internalType: \"bytes32\",\n },\n {\n name: \"account\",\n type: \"address\",\n indexed: true,\n internalType: \"address\",\n },\n {\n name: \"sender\",\n type: \"address\",\n indexed: true,\n internalType: \"address\",\n },\n ],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"Transfer\",\n inputs: [\n {\n name: \"from\",\n type: \"address\",\n indexed: true,\n internalType: \"address\",\n },\n {\n name: \"to\",\n type: \"address\",\n indexed: true,\n internalType: \"address\",\n },\n {\n name: \"tokenId\",\n type: \"uint256\",\n indexed: true,\n internalType: \"uint256\",\n },\n ],\n anonymous: false,\n },\n {\n type: \"error\",\n name: \"AccessControlBadConfirmation\",\n inputs: [],\n },\n {\n type: \"error\",\n name: \"AccessControlEnforcedDefaultAdminDelay\",\n inputs: [\n {\n name: \"schedule\",\n type: \"uint48\",\n internalType: \"uint48\",\n },\n ],\n },\n {\n type: \"error\",\n name: \"AccessControlEnforcedDefaultAdminRules\",\n inputs: [],\n },\n {\n type: \"error\",\n name: \"AccessControlInvalidDefaultAdmin\",\n inputs: [\n {\n name: \"defaultAdmin\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n },\n {\n type: \"error\",\n name: \"AccessControlUnauthorizedAccount\",\n inputs: [\n {\n name: \"account\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"neededRole\",\n type: \"bytes32\",\n internalType: \"bytes32\",\n },\n ],\n },\n {\n type: \"error\",\n name: \"AccessForbidden\",\n inputs: [],\n },\n {\n type: \"error\",\n name: \"CovenantNotFound\",\n inputs: [],\n },\n {\n type: \"error\",\n name: \"ERC721IncorrectOwner\",\n inputs: [\n {\n name: \"sender\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"tokenId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n {\n name: \"owner\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n },\n {\n type: \"error\",\n name: \"ERC721InsufficientApproval\",\n inputs: [\n {\n name: \"operator\",\n type: \"address\",\n internalType: \"address\",\n },\n {\n name: \"tokenId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n },\n {\n type: \"error\",\n name: \"ERC721InvalidApprover\",\n inputs: [\n {\n name: \"approver\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n },\n {\n type: \"error\",\n name: \"ERC721InvalidOperator\",\n inputs: [\n {\n name: \"operator\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n },\n {\n type: \"error\",\n name: \"ERC721InvalidOwner\",\n inputs: [\n {\n name: \"owner\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n },\n {\n type: \"error\",\n name: \"ERC721InvalidReceiver\",\n inputs: [\n {\n name: \"receiver\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n },\n {\n type: \"error\",\n name: \"ERC721InvalidSender\",\n inputs: [\n {\n name: \"sender\",\n type: \"address\",\n internalType: \"address\",\n },\n ],\n },\n {\n type: \"error\",\n name: \"ERC721NonexistentToken\",\n inputs: [\n {\n name: \"tokenId\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n },\n {\n type: \"error\",\n name: \"SafeCastOverflowedUintDowncast\",\n inputs: [\n {\n name: \"bits\",\n type: \"uint8\",\n internalType: \"uint8\",\n },\n {\n name: \"value\",\n type: \"uint256\",\n internalType: \"uint256\",\n },\n ],\n },\n] as const;\n","/**\n * The parts of the ERC-8004 registries Kudo uses.\n *\n * The Identity Registry is ERC-721 but not Enumerable: there is no\n * `tokenOfOwnerByIndex` and no reverse lookup, so the only route from a wallet\n * to its ids is the `Registered` event filtered on its indexed `owner`.\n */\nexport const identityRegistryAbi = [\n {\n type: \"function\",\n name: \"register\",\n inputs: [\n { name: \"agentURI\", type: \"string\" },\n {\n name: \"metadata\",\n type: \"tuple[]\",\n components: [\n { name: \"metadataKey\", type: \"string\" },\n { name: \"metadataValue\", type: \"bytes\" },\n ],\n },\n ],\n outputs: [{ name: \"agentId\", type: \"uint256\" }],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"setMetadata\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"key\", type: \"string\" },\n { name: \"value\", type: \"bytes\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"getMetadata\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"key\", type: \"string\" },\n ],\n outputs: [{ name: \"\", type: \"bytes\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"ownerOf\",\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"balanceOf\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"tokenURI\",\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n },\n {\n type: \"event\",\n name: \"Registered\",\n inputs: [\n { name: \"agentId\", type: \"uint256\", indexed: true },\n { name: \"agentURI\", type: \"string\", indexed: false },\n { name: \"owner\", type: \"address\", indexed: true },\n ],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"Transfer\",\n inputs: [\n { name: \"from\", type: \"address\", indexed: true },\n { name: \"to\", type: \"address\", indexed: true },\n { name: \"tokenId\", type: \"uint256\", indexed: true },\n ],\n anonymous: false,\n },\n] as const;\n\n/** The two reads a reputation summary needs. `getSummary` refuses an empty client list. */\nexport const reputationRegistryAbi = [\n {\n type: \"function\",\n name: \"getClients\",\n inputs: [{ name: \"agentId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address[]\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"getSummary\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"clientAddresses\", type: \"address[]\" },\n { name: \"tag1\", type: \"string\" },\n { name: \"tag2\", type: \"string\" },\n ],\n outputs: [\n { name: \"count\", type: \"uint64\" },\n { name: \"summaryValue\", type: \"int128\" },\n { name: \"summaryValueDecimals\", type: \"uint8\" },\n ],\n stateMutability: \"view\",\n },\n] as const;\n","import { BaseError, ContractFunctionRevertedError, type Hex } from \"viem\";\n\n/**\n * Revert selectors seen on Kudo deployments, with what each means in practice.\n * Matched by selector because not every error is in the ABI the SDK carries.\n */\nexport const REVERTS: Record<string, { name: string; hint: string }> = {\n \"0x468381ac\": {\n name: \"NotAuthorizedForAgent\",\n hint: \"The sending wallet does not control that ERC-8004 agent id. Mint under an id this wallet owns (see findAgentIds / registerAgent).\",\n },\n \"0xef67f5d8\": {\n name: \"AccessForbidden\",\n hint: \"The caller is not allowed: on mint the wallet lacks AGENT_ROLE (only when mint access control is on); on linkProof the caller is not the covenant's agentWallet.\",\n },\n \"0xe2517d3f\": {\n name: \"AccessControlUnauthorizedAccount\",\n hint: \"An onlyRole function refused this account. Closing a covenant is the Evaluator's job, not the agent's.\",\n },\n \"0x613970e0\": {\n name: \"InvalidParameter\",\n hint: \"The contract rejected an argument, such as an empty string or a zero address.\",\n },\n \"0x356680b7\": {\n name: \"InsufficientFunds\",\n hint: \"The wallet does not hold enough of the token for this transfer.\",\n },\n \"0xe450d38c\": {\n name: \"ERC20InsufficientBalance\",\n hint: \"The wallet does not hold enough of this token for the transfer.\",\n },\n \"0xf480469b\": {\n name: \"ConditionIsNotMet\",\n hint: \"This selector belongs to an older Kudo deployment. You are probably pointing at the wrong contract.\",\n },\n};\n\nexport type KudoErrorCode =\n | \"NO_WALLET\"\n | \"INVALID_INPUT\"\n | \"NOT_AGENT_OWNER\"\n | \"ALREADY_MET\"\n | \"ASK_NOT_MET\"\n | \"ALREADY_PROVEN\"\n | \"NOT_PROMISER\"\n | \"ALREADY_REGISTERED\"\n | \"REVERTED\"\n | \"TX_FAILED\"\n | \"TIMEOUT\"\n | \"NOT_FOUND\";\n\nexport class KudoError extends Error {\n readonly code: KudoErrorCode;\n readonly revert?: { selector?: Hex; name?: string; hint?: string };\n\n constructor(\n code: KudoErrorCode,\n message: string,\n options: { cause?: unknown; revert?: KudoError[\"revert\"] } = {},\n ) {\n super(message, { cause: options.cause });\n this.name = \"KudoError\";\n this.code = code;\n this.revert = options.revert;\n }\n}\n\n/** Turns a viem error into a KudoError that names the revert and what to do about it. */\nexport function toKudoError(error: unknown, action: string): KudoError {\n if (error instanceof KudoError) return error;\n\n let selector: Hex | undefined;\n let name: string | undefined;\n\n if (error instanceof BaseError) {\n const reverted = error.walk((e) => e instanceof ContractFunctionRevertedError);\n if (reverted instanceof ContractFunctionRevertedError) {\n name = reverted.data?.errorName;\n selector = reverted.signature ?? (reverted.raw?.slice(0, 10) as Hex | undefined);\n } else {\n // A raw eth_call (as in simulate) surfaces the revert bytes as `data`\n // on a RawContractError somewhere down the cause chain.\n const raw = error.walk((e) => typeof (e as { data?: unknown }).data === \"string\") as\n | { data?: string }\n | null;\n if (raw?.data && /^0x[0-9a-fA-F]{8}/.test(raw.data)) selector = raw.data.slice(0, 10) as Hex;\n }\n }\n\n const text = error instanceof Error ? error.message : String(error);\n if (!selector) {\n selector = Object.keys(REVERTS).find((s) => text.toLowerCase().includes(s)) as\n | Hex\n | undefined;\n }\n\n const known = selector ? REVERTS[selector.toLowerCase()] : undefined;\n name = name ?? known?.name;\n\n if (name || selector) {\n return new KudoError(\n \"REVERTED\",\n `${action} reverted${name ? ` with ${name}` : \"\"}${known ? `: ${known.hint}` : \".\"}`,\n { cause: error, revert: { selector, name, hint: known?.hint } },\n );\n }\n\n const short = error instanceof BaseError ? error.shortMessage : text;\n return new KudoError(\"TX_FAILED\", `${action} failed: ${short}`, { cause: error });\n}\n","import { defineChain, type Address, type Chain } from \"viem\";\n\n/**\n * Everything the SDK needs to know about one deployment.\n *\n * `statuses` is the contract's status enum in order: the current contract's\n * `0` is Minted. Only the current mainnet contract is listed; older Kudo\n * deployments (mainnet 0xc269…, testnet 0x7021…) use a different enum and\n * are not supported.\n */\nexport interface KudoNetwork {\n key: string;\n chain: Chain;\n kudo: Address;\n usdg: Address;\n identityRegistry: Address;\n reputationRegistry?: Address;\n statuses: readonly CovenantStatus[];\n /** Where a covenant card can be opened, `{id}` replaced. */\n covenantUrl?: string;\n explorerUrl: string;\n /** Widest block range the RPC accepts in one `eth_getLogs`. */\n maxLogRange: bigint;\n}\n\nexport type CovenantStatus = \"MINTED\" | \"IN_PROGRESS\" | \"COMPLETED\" | \"FAILED\";\n\nexport const robinhood: Chain = defineChain({\n id: 4663,\n name: \"Robinhood Chain\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: { default: { http: [\"https://rpc.mainnet.chain.robinhood.com\"] } },\n blockExplorers: {\n default: { name: \"Blockscout\", url: \"https://robinhoodchain.blockscout.com\" },\n },\n contracts: {\n multicall3: { address: \"0xca11bde05977b3631167028862be2a173976ca11\" },\n },\n});\n\nexport const networks = {\n /** Robinhood Chain mainnet, where app.kudo.archi reads and writes. */\n robinhood: {\n key: \"robinhood\",\n chain: robinhood,\n kudo: \"0x1930D0FEaB14b024353bF22adE03Db989aD640C7\",\n usdg: \"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168\",\n identityRegistry: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\",\n reputationRegistry: \"0x8004BAa17C55a88189AE136b182e5fdA19dE9b63\",\n statuses: [\"MINTED\", \"IN_PROGRESS\", \"COMPLETED\", \"FAILED\"],\n covenantUrl: \"https://app.kudo.archi/share/{id}\",\n explorerUrl: \"https://robinhoodchain.blockscout.com\",\n maxLogRange: 10_000_000n,\n },\n} as const satisfies Record<string, KudoNetwork>;\n\nexport type NetworkKey = keyof typeof networks;\n\n/** Resolves a key or a full config, with any field overridden. */\nexport function resolveNetwork(\n network: NetworkKey | KudoNetwork = \"robinhood\",\n overrides: Partial<KudoNetwork> = {},\n): KudoNetwork {\n const base = typeof network === \"string\" ? networks[network] : network;\n if (!base) {\n throw new Error(\n `Unknown Kudo network \"${String(network)}\". Known: ${Object.keys(networks).join(\", \")}`,\n );\n }\n return { ...base, ...overrides };\n}\n","import type { Address, Hex } from \"viem\";\nimport type { CovenantStatus } from \"./networks.js\";\n\n/**\n * The three covenant types. Direction is the order the two legs happen in.\n *\n * | type | ask | promise |\n * |---------|----------------------------|------------------------------|\n * | LOAN | lend me USDG | repay more USDG later |\n * | INVOICE | do the work and bill me | pay for it afterwards |\n * | ADVANCE | pay me up front | deliver the work afterwards |\n *\n * `nftType` cannot be changed after minting, and INVOICE / ADVANCE are easy to\n * swap: an invoice follows completed work, an advance is money before work.\n */\nexport const COVENANT_TYPES = [\"LOAN\", \"INVOICE\", \"ADVANCE\"] as const;\nexport type CovenantType = (typeof COVENANT_TYPES)[number];\n\n/**\n * Where a covenant is in its life, derived from the raw fields.\n *\n * Only the Evaluator moves the contract's `status`: to IN_PROGRESS when it\n * has checked the ask's evidence and accepted it, and to COMPLETED or FAILED\n * when it closes the covenant. Attesting a leg does not move it, so a\n * covenant with both proofs written may still read MINTED. `stage` is what to\n * show a person or act on.\n *\n * - `ask-open` nobody has met the ask yet; anyone can take it\n * - `ask-claimed` someone claimed the ask; the Evaluator has not\n * accepted the claim yet, so nothing is owed\n * - `promise-due` the Evaluator accepted the claim (IN_PROGRESS);\n * the promiser owes the promise now\n * - `awaiting-evaluation` both legs have proof; the Evaluator has not ruled\n * - `completed` the Evaluator closed it as kept\n * - `failed` the Evaluator closed it as broken\n */\nexport const COVENANT_STAGES = [\"ask-open\", \"ask-claimed\", \"promise-due\", \"awaiting-evaluation\", \"completed\", \"failed\"] as const;\nexport type CovenantStage = (typeof COVENANT_STAGES)[number];\n\nexport interface Covenant {\n id: bigint;\n /** Current holder of the cNFT, where the read returns it. */\n owner?: Address;\n /** The wallet that owes the promise. Only it can link the promise proof. */\n agentWallet: Address;\n /**\n * The ERC-8004 identity the covenant was minted under. The current contract\n * binds a mint to an id the minter controls; on older deployments it is only\n * a claim, so check `ownerOf(agentId) == agentWallet` before relying on it.\n */\n agentId: bigint;\n status: CovenantStatus;\n stage: CovenantStage;\n type: string;\n ask: string;\n promise: string;\n /** Counterparty's instruction for how to be paid, written when they meet the ask. */\n promiseDetail: string;\n /** Proof the ask was met: a tx hash or a URL. Empty until met. */\n askProof: string;\n /** When the ask was met. The promise's window runs from here, not from the mint. */\n askSettledAt: Date | null;\n /** Proof the promise was kept. Empty until linked. */\n promiseProof: string;\n /** Link to the covenant card, where the network has one. */\n url?: string;\n}\n\n/** An unsigned transaction. Sign it with any wallet, or pass it to `kudo.send`. */\nexport interface TxRequest {\n to: Address;\n data: Hex;\n value: bigint;\n chainId: number;\n /** One line saying what the transaction does, for a human or a model to check before signing. */\n description: string;\n}\n\nexport interface MintCovenantInput {\n /** ERC-8004 id the covenant is minted under. The sending wallet must control it. */\n agentId: bigint | number | string;\n type: CovenantType;\n /** What the counterparty does. Permanent: state amounts in USDG and say why. */\n ask: string;\n /** What this agent does in return, in an ordinary sentence. Permanent. */\n promise: string;\n}\n\nexport interface MeetAskInput {\n /** Proof the ask was performed: a tx hash for a payment, a URL for work. */\n proof: string;\n /**\n * How the promiser should pay you, e.g. \"pay: 0xabc…\". The promise was\n * written before anyone knew who the counterparty would be, so this is\n * usually where the recipient address arrives.\n */\n promiseDetail?: string;\n}\n\nexport interface RegisterAgentInput {\n /** Display name, stored as `name` metadata. */\n name: string;\n /** Optional token URI pointing at an agent card JSON. */\n uri?: string;\n /** Extra metadata, e.g. `{ endpoint: \"https://…\" }`. Values are UTF-8 encoded. */\n metadata?: Record<string, string>;\n}\n\nexport interface AgentInfo {\n agentId: bigint;\n owner: Address;\n name: string | null;\n teeId: string | null;\n uri: string | null;\n}\n\nexport interface AgentRecord extends AgentInfo {\n covenants: {\n total: number;\n kept: number;\n broken: number;\n /** Ask still open, promise due or awaiting evaluation. */\n open: number;\n };\n /** ERC-8004 Reputation Registry summary, where any client has posted feedback. */\n reputation: { count: number; value: number } | null;\n recent: Covenant[];\n}\n\nexport interface CovenantFilter {\n stage?: CovenantStage | CovenantStage[];\n type?: string;\n agentId?: bigint | number | string;\n agentWallet?: Address;\n /** Newest first, at most this many. */\n limit?: number;\n}\n\nexport interface OpenAskFilter {\n type?: string;\n agentId?: bigint | number | string;\n /** Leave out covenants minted by this wallet (you cannot be your own counterparty). Defaults to the connected account. */\n excludeWallet?: Address;\n limit?: number;\n}\n","/**\n * Phala dstack: the guest agent inside a TEE (confidential VM) serves key\n * derivation and app info over a Unix socket.\n *\n * A key from dstack is derived from the app's identity inside the enclave, so\n * it never exists outside it and is the same on every restart of the same app.\n * Node only: it talks HTTP over a Unix socket.\n */\nimport { KudoError } from \"./errors.js\";\n\nexport const DSTACK_SOCKET = \"/var/run/dstack.sock\";\n/** The key path the Kudo skill uses, so every integration derives the same wallet. */\nexport const DSTACK_KEY_PATH = \"kudo/agent\";\n\nexport interface DstackOptions {\n /** Default /var/run/dstack.sock. */\n socket?: string;\n timeoutMs?: number;\n}\n\nasync function call<T>(path: string, body: unknown, options: DstackOptions): Promise<T> {\n const { request } = await import(\"node:http\");\n const socketPath = options.socket ?? DSTACK_SOCKET;\n return new Promise<T>((resolve, reject) => {\n const payload = body === undefined ? undefined : JSON.stringify(body);\n const req = request(\n {\n socketPath,\n path,\n method: payload ? \"POST\" : \"GET\",\n headers: payload ? { \"content-type\": \"application/json\", \"content-length\": Buffer.byteLength(payload) } : {},\n timeout: options.timeoutMs ?? 5000,\n },\n (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (c: Buffer) => chunks.push(c));\n res.on(\"end\", () => {\n if (res.statusCode !== 200) return reject(new KudoError(\"NOT_FOUND\", `dstack ${path} returned ${res.statusCode}.`));\n try {\n resolve(JSON.parse(Buffer.concat(chunks).toString(\"utf8\")) as T);\n } catch {\n reject(new KudoError(\"NOT_FOUND\", `dstack ${path} did not return JSON.`));\n }\n });\n },\n );\n req.on(\"timeout\", () => req.destroy(new Error(\"timed out\")));\n req.on(\"error\", (e) =>\n reject(new KudoError(\"NOT_FOUND\", `Cannot reach dstack at ${socketPath} (${e.message}). Is this running in a Phala TEE?`)),\n );\n req.end(payload);\n });\n}\n\n/** Derives this app's secp256k1 key from dstack. Never log the result. */\nexport async function dstackPrivateKey(path = DSTACK_KEY_PATH, options: DstackOptions = {}): Promise<`0x${string}`> {\n const { key } = await call<{ key?: string }>(\"/GetKey\", { path, purpose: \"signing\" }, options);\n const hex = (key ?? \"\").replace(/^0x/i, \"\");\n if (!/^[0-9a-fA-F]{64}$/.test(hex)) throw new KudoError(\"NOT_FOUND\", \"dstack GetKey did not return a 32-byte key.\");\n return `0x${hex}`;\n}\n\n/** The Phala app id (bare lowercase hex), the id a Trust Center report is published under. */\nexport async function dstackAppId(options: DstackOptions = {}): Promise<string> {\n const { app_id } = await call<{ app_id?: string }>(\"/Info\", undefined, options);\n if (!app_id) throw new KudoError(\"NOT_FOUND\", \"dstack Info returned no app_id.\");\n return app_id.replace(/^0x/i, \"\").toLowerCase();\n}\n"],"mappings":"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","names":["call"]}
package/package.json CHANGED
@@ -1,6 +1,59 @@
1
1
  {
2
2
  "name": "@kudo-dev/sdk",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "A TypeScript library for Kudo covenants on Robinhood Chain: register an ERC-8004 agent, mint, meet an ask, link proof and read records, with your own viem wallet or as unsigned transactions.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "homepage": "https://app.kudo.archi/connect",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/Kudo-Agentic/kudo-agent.git",
11
+ "directory": "packages/sdk"
12
+ },
13
+ "keywords": [
14
+ "kudo",
15
+ "covenant",
16
+ "erc-8004",
17
+ "robinhood-chain",
18
+ "ai-agents",
19
+ "viem"
20
+ ],
21
+ "sideEffects": false,
22
+ "main": "./dist/index.cjs",
23
+ "module": "./dist/index.js",
24
+ "types": "./dist/index.d.ts",
25
+ "exports": {
26
+ ".": {
27
+ "import": {
28
+ "types": "./dist/index.d.ts",
29
+ "default": "./dist/index.js"
30
+ },
31
+ "require": {
32
+ "types": "./dist/index.d.cts",
33
+ "default": "./dist/index.cjs"
34
+ }
35
+ }
36
+ },
37
+ "files": [
38
+ "dist",
39
+ "README.md"
40
+ ],
41
+ "scripts": {
42
+ "build": "tsup",
43
+ "typecheck": "tsc --noEmit",
44
+ "test": "vitest run"
45
+ },
46
+ "peerDependencies": {
47
+ "viem": "^2.20.0"
48
+ },
49
+ "devDependencies": {
50
+ "@types/node": "^22.10.2",
51
+ "tsup": "^8.5.0",
52
+ "typescript": "^5.9.3",
53
+ "viem": "^2.37.0",
54
+ "vitest": "^3.2.0"
55
+ },
56
+ "engines": {
57
+ "node": ">=18"
58
+ }
59
+ }