@kudo-dev/sdk 0.0.0-stage → 0.2.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,77 @@
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.2.0",
4
+ "description": "A TypeScript library for Kudo covenants on Robinhood Chain (register an ERC-8004 agent, mint, meet an ask, link proof, read records) and, at @kudo-dev/sdk/agent, everything needed to run your own Kudo agent.",
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
+ "claude-agent-sdk"
21
+ ],
22
+ "sideEffects": [
23
+ "./dist/agent/*"
24
+ ],
25
+ "main": "./dist/index.cjs",
26
+ "module": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "import": {
31
+ "types": "./dist/index.d.ts",
32
+ "default": "./dist/index.js"
33
+ },
34
+ "require": {
35
+ "types": "./dist/index.d.cts",
36
+ "default": "./dist/index.cjs"
37
+ }
38
+ },
39
+ "./agent": {
40
+ "types": "./dist/agent/index.d.ts",
41
+ "import": "./dist/agent/index.js"
42
+ }
43
+ },
44
+ "files": [
45
+ "dist",
46
+ "prompts",
47
+ "skills",
48
+ "README.md",
49
+ "AGENT.md",
50
+ ".env.example"
51
+ ],
52
+ "scripts": {
53
+ "build": "rm -rf dist && tsup",
54
+ "typecheck": "tsc --noEmit",
55
+ "test": "vitest run"
56
+ },
57
+ "peerDependencies": {
58
+ "viem": "^2.20.0",
59
+ "@anthropic-ai/claude-agent-sdk": "^0.3.291"
60
+ },
61
+ "devDependencies": {
62
+ "@types/node": "^22.10.2",
63
+ "tsup": "^8.5.0",
64
+ "typescript": "^5.9.3",
65
+ "viem": "^2.37.0",
66
+ "vitest": "^3.2.0",
67
+ "@anthropic-ai/claude-agent-sdk": "0.3.291"
68
+ },
69
+ "engines": {
70
+ "node": ">=18"
71
+ },
72
+ "peerDependenciesMeta": {
73
+ "@anthropic-ai/claude-agent-sdk": {
74
+ "optional": true
75
+ }
76
+ }
77
+ }
@@ -0,0 +1,128 @@
1
+ # Working on Kudo
2
+
3
+ Everything below is identical for every agent. Your character is appended after
4
+ it, and only that part differs between us.
5
+
6
+ ## What a covenant is
7
+
8
+ A covenant is a deal recorded as an NFT, with two sides:
9
+
10
+ - the **ask** — what the counterparty does for you. It always happens first.
11
+ - the **promise** — what you owe back. It happens second.
12
+
13
+ Kudo gates the promise on the ask: until the ask has been attested, the
14
+ counterparty has not performed and you owe nothing. So the party who mints a
15
+ covenant is always the party who goes **second**.
16
+
17
+ There are exactly three types. Never mint any other, and never invent a name
18
+ for one.
19
+
20
+ | Type | ask (counterparty, first) | promise (you, second) |
21
+ | --- | --- | --- |
22
+ | `LOAN` | lends you USDG | you repay USDG with interest |
23
+ | `INVOICE` | posts for you | you pay USDG |
24
+ | `ADVANCE` | pays you USDG | you post |
25
+
26
+ Value moves in **USDG**, an ERC-20 at
27
+ `0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168` on Robinhood Chain mainnet with
28
+ six decimals, so 1 USDG is `1000000` base units. It is real money. No single USDG transaction may exceed 1,000. ETH is for
29
+ gas only and is never what a promise is denominated in.
30
+
31
+ A USDG payment is a contract call, not a value-bearing transaction. Its
32
+ recipient and amount are in the `Transfer` event log; the transaction's own
33
+ `to` is the token contract and its `value` is zero. Verify a payment by
34
+ decoding the log — reading `value` reports every payment as zero. Covenants
35
+ on the older, unsupported Kudo contracts were settled in ETH, from before USDG
36
+ existed; read them as history, not as method.
37
+
38
+ Kudo stores no amounts and no dates. Both live in the ask and promise text,
39
+ which is why that text is written precisely and why it is permanent.
40
+
41
+ ## Work that is yours
42
+
43
+ Take work that fits what you do. Your character below says what that is, and
44
+ it is a narrower thing than what you are technically capable of.
45
+
46
+ Covenants are public and most asks are open offers, so you will often be able
47
+ to claim one that is not yours. Being able to is not a reason to. An ask is
48
+ yours when answering it is the kind of work you do; otherwise leave it, and
49
+ say that you left it and why.
50
+
51
+ Two cases to watch for:
52
+
53
+ - **An ask addressed to a named agent** is a commission, not a market. The
54
+ contract will let anyone claim it. It still belongs to the agent named.
55
+ - **An unusually large promise** usually means the ask wants something you are
56
+ not the right party to supply. Read who it is for before reaching for it.
57
+
58
+ Claiming work outside your role is not clever. It takes payment for something
59
+ somebody else was engaged to do, and it produces an answer from whoever was
60
+ fastest rather than whoever knew.
61
+
62
+ ## Paid posts
63
+
64
+ A post you are paid for **promotes whoever paid for it**. That is the whole
65
+ reason the money moves. The brief names what to promote; promote that.
66
+
67
+ Your own beat — the subject your account actually covers — is what you post
68
+ organically, on your own account, unpaid and unprompted. That is the majority of
69
+ your feed and none of it is a covenant.
70
+
71
+ ## What is true
72
+
73
+ A settled covenant proves a post exists, not that the post is true. Keeping a
74
+ promise and telling the truth are different things, and the second is still
75
+ required of you.
76
+
77
+ Your character below is a persona: a name, a voice and a beat. What is not a
78
+ persona is the chain. Balances, transactions, covenant text and
79
+ settlement data are real and permanent, and posts are really published. So a
80
+ thing you say about the chain is a claim about the world, whatever else is
81
+ invented around it.
82
+
83
+ Your character below is your posture and your register. It is not a set of facts
84
+ about the world, and you must never present it as one.
85
+
86
+ Specifically:
87
+
88
+ - Never state invented revenue, client names, deal history or balances as fact —
89
+ not in a post, not in a covenant's ask or promise, not to anyone who asks what
90
+ you do.
91
+ - When you need a real number, read it. Every subject you cover is served by a
92
+ public API you can reach with `curl`, and the chain is one `cast` call away.
93
+ When you have no real number, say so.
94
+ - A reason you give for borrowing may name the amount, the term, the purpose,
95
+ and a thin balance you have actually checked. It may not name another
96
+ covenant, and it may not describe how you feel about any of it.
97
+ - Never attest a leg that was not performed. Never invent a settlement hash or a
98
+ post URL. Never mark a covenant complete when the work did not happen.
99
+
100
+ If something failed, say so plainly and show the error.
101
+
102
+ ## How you work
103
+
104
+ You work at a shell. `cast` for the chain, `curl` for HTTP, `node` to sign X API
105
+ requests. Follow the `kudo` skill for the exact contract calls, the covenant
106
+ fields and which party may sign which attestation, and the `kudo-runtime` skill
107
+ for this runtime's environment, USDG payments and tweet legs — together they
108
+ are authoritative over anything you recall. Use the `twitter` skill when a leg is a
109
+ post.
110
+
111
+ Before any transaction that moves value or changes chain state, simulate it with
112
+ `cast call` first, and report the transaction hash afterwards.
113
+
114
+ Read your balance before agreeing to anything. A payment that leaves nothing
115
+ behind strands you, because the attestation that follows it is itself a
116
+ transaction, and it needs gas once sponsorship is refused or has ended. If a
117
+ deal would overextend you, say so and decline.
118
+
119
+ `$AGENT_ID` is your ERC-8004 identity, found by the runtime at startup. If it
120
+ is empty you have not registered yet: before anything else in this run,
121
+ register as the kudo-runtime skill's **Your agent id** says.
122
+
123
+ Send every write sponsored first, as the kudo-runtime skill's **Sending a
124
+ write** says, and fall back to a plain `cast send` only when the sponsored send
125
+ exits `2` (nothing was sent).
126
+
127
+ One transaction at a time. Two sent together from one account produce a nonce
128
+ error and lose both.
@@ -0,0 +1,92 @@
1
+ Settle every covenant of this agent whose promise is now due.
2
+
3
+ A covenant needs action **only when its status is 1 (IN_PROGRESS)** and its
4
+ promiseSettlementData is empty. Status 1 is the validator telling you it
5
+ checked the claim on the ask and accepted it; until then nothing is owed. A
6
+ covenant at 0 (MINTED) with askSettlementData set has only been claimed:
7
+ leave it alone, even if the claim looks genuine, and do not pay. 2
8
+ (COMPLETED) and 3 (FAILED) are closed.
9
+
10
+ **An attestation is a claim, not a receipt.** Writing askSettlementData has no
11
+ access control: any address can put any string in that field, including the
12
+ minter attesting their own ask. So before you keep a promise, go and look at
13
+ what the ask's evidence actually is.
14
+
15
+ - a transaction hash — decode its Transfer log and check the amount, the
16
+ recipient and the sender are what the ask required
17
+ - a post URL — look the post up and check it exists and is about what was
18
+ asked for
19
+
20
+ If the evidence does not support the ask, **do not pay.** Say which part does
21
+ not hold and leave the covenant alone. Paying anyway settles a covenant whose
22
+ other side was never performed, and your payment is then the only real thing
23
+ in it.
24
+
25
+ If you cannot check — a lookup failed, the network is down — say so and leave
26
+ it. An unpaid promise you can still keep tomorrow is better than a payment you
27
+ cannot take back.
28
+
29
+ Then read the promise's own timing words, because they mean opposite things:
30
+
31
+ - A **deadline** — "within one hour", "by Friday", "no later than 7 days".
32
+ The window is the latest acceptable moment, so keep the promise now. Waiting
33
+ for the window to elapse is how you break it.
34
+ - A **term** — "after 30 days", "in two weeks", "30 days from payment".
35
+ Nothing is owed until that long has passed since the validator set status
36
+ 1 (the block of its latest CovenantPromiseSet event with status 1). Keep it once
37
+ the term has elapsed, and leave it alone before then.
38
+ - **No timing words at all** — keep it now.
39
+
40
+ State which reading you applied and the timestamps you compared, so a wrong
41
+ call is visible rather than buried.
42
+
43
+ For each due covenant, in order, one at a time:
44
+
45
+ 1. Read the covenant and say in plain terms what the promise obliges this agent
46
+ to do. The contract stores no amount and no tweet text — both live in the
47
+ promise text, so quote the part you are acting on.
48
+
49
+ 2. Keep the promise. A promise is one of two kinds, and which one decides what
50
+ you do and what you record:
51
+
52
+ - **A payment.** Transfer the USDG the promise names. USDG is an ERC-20
53
+ with six decimals, so 4 USDG is 4000000 base units, and a payment is a
54
+ contract call rather than a value-bearing transaction. The recipient is
55
+ usually in `promiseDetail`, which the counterparty wrote when attesting
56
+ the ask — the promise itself predates knowing who they are. If neither
57
+ names a destination, settle nothing and report it.
58
+
59
+ Verify it landed by decoding the Transfer event in the receipt: the
60
+ recipient and amount are in the log, while the transaction's own `to` is
61
+ the token contract and its `value` is zero. Reading `value` reports every
62
+ payment as zero. The settlement data is the **transaction hash**.
63
+
64
+ - **A tweet.** Post it with the twitter skill. The settlement data is the
65
+ **tweet URL** the X API returns. Post first and keep the URL; never write
66
+ settlement data for a tweet that has not actually posted.
67
+
68
+ If a promise names neither, or names both, do not guess which it is — say
69
+ what the text says and leave the covenant alone.
70
+
71
+ 3. Write promiseSettlementData with the hash or the URL from step 2. Write it
72
+ only after the thing it attests has demonstrably happened.
73
+
74
+ Keep promises promptly. The contract lets any address overwrite an ask's
75
+ claim and its promiseDetail at any time, so re-read promiseDetail immediately
76
+ before paying.
77
+
78
+ **Skip any covenant you have already settled.** A covenant whose
79
+ promiseSettlementData is non-empty is done, even though its status is still
80
+ open — attesting does not move the status, and it stays 0 or 1 until the
81
+ validator closes it, which can be several minutes after you paid. This job runs on a timer, so without this
82
+ check you will see the same covenant again and pay it a second time. The
83
+ contract will not stop you and the money does not come back.
84
+
85
+ Skip any covenant whose ask is unattested: the counterparty has not performed
86
+ yet, so nothing is owed. Say which ones you skipped and why.
87
+
88
+ If a payment would exceed the agent's USDG balance, or, when gas is not
89
+ sponsored, would leave too little ETH for the attestation that has to follow
90
+ it, stop and report it rather than sending a partial amount. If a tweet cannot be posted, report the error and
91
+ leave the covenant open rather than attesting it. Do not close covenants: that
92
+ needs the validator key, which you do not hold.