@invariance/sdk 0.0.1

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/core/InvarianceClient.ts","../src/core/ContractFactory.ts","../src/core/EventEmitter.ts","../src/core/BatchExecutor.ts","../src/core/SessionContext.ts","../src/modules/policy/templates.ts","../src/core/PipelineBuilder.ts","../src/core/Telemetry.ts","../src/core/env.ts","../src/utils/indexer-client.ts","../src/utils/indexer-mappers.ts","../src/modules/identity/IdentityManager.ts","../src/modules/wallet/WalletManager.ts","../src/utils/usdc.ts","../src/modules/x402/X402Client.ts","../src/modules/x402/X402Manager.ts","../src/modules/intent/IntentProtocol.ts","../src/utils/amounts.ts","../src/modules/policy/rule-serializer.ts","../src/modules/policy/PolicyEngine.ts","../src/modules/escrow/EscrowManager.ts","../src/modules/ledger/LedgerAnalytics.ts","../src/modules/ledger/EventLedger.ts","../src/modules/ledger/EventLedgerCompact.ts","../src/modules/ledger/AutoBatchedEventLedgerCompact.ts","../src/modules/verify/Verifier.ts","../src/modules/verify/AtomicVerifier.ts","../src/modules/reputation/ReputationEngine.ts","../src/modules/gas/GasManager.ts","../src/modules/erc8004/ERC8004Manager.ts","../src/modules/erc8004/abis.ts","../src/modules/erc8004/addresses.ts","../src/modules/erc8004/InvarianceBridge.ts","../src/modules/marketplace/MarketplaceKit.ts","../src/modules/audit/AuditTrail.ts","../src/modules/voting/vote-signing.ts","../src/modules/voting/merkle-builder.ts","../src/modules/voting/VotingManager.ts","../src/utils/webhook.ts","../src/adapters/RuntimeHookAdapter.ts","../src/adapters/MultiAgentComposer.ts","../src/adapters/MarketplacePlugin.ts","../src/adapters/ReputationBridge.ts","../src/adapters/CrossChainEscrow.ts","../src/adapters/IdentityGatekeeper.ts","../src/adapters/BCIIntentVerifier.ts","../src/adapters/MEVComplianceKit.ts","../src/adapters/GovernmentComplianceKit.ts","../src/adapters/SocialGraphAdapter.ts","../src/index.ts"],"sourcesContent":["import type { InvarianceConfig, SpecPolicy, EscrowContract } from '@invariance/common';\nimport { base, baseSepolia } from 'viem/chains';\nimport { privateKeyToAccount, generatePrivateKey, mnemonicToAccount } from 'viem/accounts';\nimport { ContractFactory } from './ContractFactory.js';\nimport { InvarianceEventEmitter } from './EventEmitter.js';\nimport type {\n QuickSetupOptions,\n QuickSetupResult,\n HireAndFundOptions,\n BatchRegisterOptions,\n BatchRegisterEntry,\n ExecuteAndLogOptions,\n ExecuteAndLogResult,\n RecurringPaymentOptions,\n CreateMultiSigOptions,\n SetupRateLimitedAgentOptions,\n HireAndReviewOptions,\n HireAndReviewResult,\n AuditOptions,\n AuditReport,\n DelegateOptions,\n DelegateResult,\n DeferredOperation,\n BatchOptions,\n BatchResult,\n SessionOptions,\n} from './convenience-types.js';\nimport { BatchExecutor } from './BatchExecutor.js';\nimport { SessionContext } from './SessionContext.js';\nimport { PipelineBuilder } from './PipelineBuilder.js';\nimport { Telemetry } from './Telemetry.js';\nimport { loadEnvConfig } from './env.js';\nimport { IdentityManager } from '../modules/identity/IdentityManager.js';\nimport { WalletManager } from '../modules/wallet/WalletManager.js';\nimport { IntentProtocol } from '../modules/intent/IntentProtocol.js';\nimport { PolicyEngine } from '../modules/policy/PolicyEngine.js';\nimport { EscrowManager } from '../modules/escrow/EscrowManager.js';\nimport { EventLedger } from '../modules/ledger/EventLedger.js';\nimport { EventLedgerCompact } from '../modules/ledger/EventLedgerCompact.js';\nimport { AutoBatchedEventLedgerCompact } from '../modules/ledger/AutoBatchedEventLedgerCompact.js';\nimport type { AutoBatchConfig } from '../modules/ledger/types.js';\nimport { Verifier } from '../modules/verify/Verifier.js';\nimport { AtomicVerifier } from '../modules/verify/AtomicVerifier.js';\nimport { ReputationEngine } from '../modules/reputation/ReputationEngine.js';\nimport { GasManager } from '../modules/gas/GasManager.js';\nimport { X402Manager } from '../modules/x402/X402Manager.js';\nimport { ERC8004Manager } from '../modules/erc8004/ERC8004Manager.js';\nimport { InvarianceBridge } from '../modules/erc8004/InvarianceBridge.js';\nimport { MarketplaceKit } from '../modules/marketplace/MarketplaceKit.js';\nimport type { VerificationResult } from '../modules/verify/types.js';\nimport { AuditTrail } from '../modules/audit/AuditTrail.js';\nimport type { GateActionOptions, GateActionResult } from '../modules/audit/types.js';\nimport { VotingManager } from '../modules/voting/VotingManager.js';\n\ndeclare const __SDK_VERSION__: string;\n\n/**\n * Current SDK version, injected at build time via tsup define.\n */\nexport const SDK_VERSION: string = __SDK_VERSION__;\n\n/**\n * The callable verify interface.\n *\n * Supports both `inv.verify(txHash)` direct call syntax\n * and sub-methods like `inv.verify.action()`.\n */\nexport interface VerifyProxy extends Verifier {\n (txHash: string): Promise<VerificationResult>;\n}\n\n/**\n * The main entry point for the Invariance SDK.\n *\n * Lazily initializes all 12 module managers and exposes them as properties.\n * The constructor validates chain configuration and contract availability.\n *\n * @example\n * ```typescript\n * import { Invariance } from '@invariance/sdk';\n *\n * // Self-hosted\n * const inv = new Invariance({\n * chain: 'base',\n * rpcUrl: 'https://mainnet.base.org',\n * signer: wallet,\n * });\n *\n * // Managed hosting\n * const inv = new Invariance({\n * apiKey: 'inv_live_xxx',\n * chain: 'base',\n * });\n *\n * // Register an identity\n * const agent = await inv.identity.register({\n * type: 'agent',\n * owner: '0xDev',\n * label: 'TraderBot',\n * });\n *\n * // Execute a verified intent\n * const result = await inv.intent.request({\n * actor: { type: 'agent', address: agent.address },\n * action: 'swap',\n * params: { from: 'USDC', to: 'ETH', amount: '100' },\n * approval: 'auto',\n * });\n *\n * // Verify any transaction\n * const verification = await inv.verify('0xtxhash...');\n * ```\n */\nexport class Invariance {\n private readonly config: InvarianceConfig;\n private readonly contracts: ContractFactory;\n private readonly events: InvarianceEventEmitter;\n private readonly telemetry: Telemetry;\n\n // Lazy-initialized module instances\n private _identity?: IdentityManager;\n private _wallet?: WalletManager;\n private _walletInitPromise?: Promise<void> | undefined;\n private _intent?: IntentProtocol;\n private _policy?: PolicyEngine;\n private _escrow?: EscrowManager;\n private _ledger?: EventLedger;\n private _ledgerCompact?: EventLedgerCompact;\n private _verify?: VerifyProxy;\n private _atomic?: AtomicVerifier;\n private _reputation?: ReputationEngine;\n private _gas?: GasManager;\n private _x402?: X402Manager;\n private _erc8004?: ERC8004Manager;\n private _erc8004Bridge?: InvarianceBridge;\n private _marketplace?: MarketplaceKit;\n private _auditTrail?: AuditTrail;\n private _voting?: VotingManager;\n\n // ===========================================================================\n // Static Factory Methods\n // ===========================================================================\n\n /**\n * Generate a fresh random wallet and return an Invariance client.\n *\n * @example\n * ```typescript\n * const inv = Invariance.createRandom({ chain: 'base-sepolia' });\n * console.log(inv.wallet.getAddress());\n * ```\n */\n static createRandom(config?: Partial<InvarianceConfig>): Invariance {\n const key = generatePrivateKey();\n const account = privateKeyToAccount(key);\n return new Invariance({ ...config, signer: account });\n }\n\n /**\n * Create a client from a hex private key string.\n *\n * @param key - Hex private key (with or without 0x prefix)\n * @param config - Optional SDK configuration overrides\n *\n * @example\n * ```typescript\n * const inv = Invariance.fromPrivateKey('0xabc...', { chain: 'base-sepolia' });\n * ```\n */\n static fromPrivateKey(key: string, config?: Partial<InvarianceConfig>): Invariance {\n const hex = key.startsWith('0x') ? key : `0x${key}`;\n const account = privateKeyToAccount(hex as `0x${string}`);\n return new Invariance({ ...config, signer: account });\n }\n\n /**\n * Create a client from a BIP-39 mnemonic phrase.\n *\n * @param phrase - 12 or 24 word mnemonic\n * @param config - Optional SDK configuration overrides\n *\n * @example\n * ```typescript\n * const inv = Invariance.fromMnemonic('abandon abandon ... about', { chain: 'base' });\n * ```\n */\n static fromMnemonic(phrase: string, config?: Partial<InvarianceConfig>): Invariance {\n const account = mnemonicToAccount(phrase);\n return new Invariance({ ...config, signer: account });\n }\n\n constructor(config?: Partial<InvarianceConfig>) {\n const envConfig = loadEnvConfig();\n const merged = { ...envConfig, ...config } as InvarianceConfig;\n\n if (!merged.chain) {\n throw new Error(\n 'No chain configured. Set INVARIANCE_CHAIN env var or pass { chain } in config.',\n );\n }\n\n this.config = merged;\n this.contracts = new ContractFactory(merged);\n this.events = new InvarianceEventEmitter();\n this.telemetry = new Telemetry(merged.telemetry === true);\n\n this.telemetry.track('sdk.init', {\n chain: merged.chain,\n managed: merged.apiKey !== undefined,\n gasStrategy: merged.gasStrategy ?? 'standard',\n });\n\n // Initialize wallet if signer provided\n if (merged.signer !== undefined) {\n const chain = merged.chain === 'base' ? base : baseSepolia;\n const rpcUrl = this.contracts.getRpcUrl();\n this._wallet = new WalletManager(this.contracts, this.telemetry, this.config);\n\n this._walletInitPromise = this._wallet.initFromSigner(merged.signer, rpcUrl, chain).then(() => {\n if (this._wallet!.isConnected()) {\n this.contracts.setClients(this._wallet!.getPublicClient(), this._wallet!.getWalletClient());\n }\n }).catch((err: unknown) => {\n console.error('[Invariance] Wallet initialization failed:', err instanceof Error ? err.message : String(err));\n // Clear the promise so subsequent calls to ensureWalletInit() don't hang\n this._walletInitPromise = undefined;\n throw err;\n });\n }\n }\n\n /**\n * Ensure wallet initialization is complete.\n * Call this before using any contract methods.\n *\n * @remarks\n * This is called automatically when accessing module getters,\n * so manual calls are rarely needed.\n */\n async ensureWalletInit(): Promise<void> {\n if (this._walletInitPromise) {\n await this._walletInitPromise;\n }\n }\n\n /**\n * Internal: ensure wallet init is complete.\n * Called automatically by module getters.\n * @internal\n */\n private _autoInit(): void {\n if (this._walletInitPromise) {\n // Attach a no-op catch to prevent unhandled rejection warnings.\n // For async providers (EIP-1193, Privy), callers should await ready()\n // or ensureWalletInit() before making contract calls.\n this._walletInitPromise.catch(() => {\n // Error already logged in the constructor .catch() handler\n });\n }\n }\n\n // ===========================================================================\n // Module Accessors (lazy initialization)\n // ===========================================================================\n\n /**\n * Identity management module.\n *\n * Register agents, humans, devices as verified identities.\n * 10 methods: register, get, resolve, update, pause, resume, deactivate, list, attest, attestations\n */\n get identity(): IdentityManager {\n this._autoInit();\n if (!this._identity) {\n this._identity = new IdentityManager(this.contracts, this.events, this.telemetry);\n }\n return this._identity;\n }\n\n /**\n * Ensure wallet is initialized before performing contract operations.\n * Automatically called internally; rarely needed by consumers.\n * @internal\n */\n async ready(): Promise<this> {\n await this.ensureWalletInit();\n return this;\n }\n\n /**\n * Wallet management module.\n *\n * Key management, embedded wallets via Privy.\n * 9 methods: create, connect, get, fund, balance, export, exportPrivateKey, signMessage, disconnect\n */\n get wallet(): WalletManager {\n this._autoInit();\n if (!this._wallet) {\n this._wallet = new WalletManager(this.contracts, this.telemetry, this.config);\n }\n return this._wallet;\n }\n\n /**\n * Intent Protocol module.\n *\n * Request -> Approve -> Execute -> Verify handshake.\n * 6 methods: request, prepare, approve, reject, status, history\n */\n get intent(): IntentProtocol {\n this._autoInit();\n if (!this._intent) {\n this._intent = new IntentProtocol(this.contracts, this.events, this.telemetry);\n }\n return this._intent;\n }\n\n /**\n * Policy Engine module.\n *\n * Composable, verifiable condition sets.\n * 9 methods: create, attach, detach, evaluate, revoke, status, list, compose, onViolation\n */\n get policy(): PolicyEngine {\n this._autoInit();\n if (!this._policy) {\n this._policy = new PolicyEngine(this.contracts, this.events, this.telemetry);\n }\n return this._policy;\n }\n\n /**\n * Escrow module.\n *\n * USDC escrow with multi-sig, conditional release.\n * 11 methods: create, fund, release, refund, dispute, resolve, approve, approvals, status, list, onStateChange\n */\n get escrow(): EscrowManager {\n this._autoInit();\n if (!this._escrow) {\n this._escrow = new EscrowManager(this.contracts, this.events, this.telemetry);\n }\n return this._escrow;\n }\n\n /**\n * Event Ledger module.\n *\n * Immutable on-chain logging with dual signatures.\n * 5 methods: log, batch, query, stream, export\n */\n get ledger(): EventLedger {\n this._autoInit();\n if (!this._ledger) {\n this._ledger = new EventLedger(this.contracts, this.events, this.telemetry);\n }\n return this._ledger;\n }\n\n /**\n * Compact Event Ledger module (fraud-proof).\n *\n * Uses CompactLedger with EIP-712 dual signatures verified on-chain.\n * Requires an API key for platform attestation.\n *\n * @example\n * ```typescript\n * const entry = await inv.ledgerCompact.log({\n * action: 'model-inference',\n * actor: { type: 'agent', address: '0xBot' },\n * });\n * ```\n */\n get ledgerCompact(): EventLedgerCompact {\n this._autoInit();\n if (!this._ledgerCompact) {\n this._ledgerCompact = new EventLedgerCompact(this.contracts, this.events, this.telemetry);\n }\n return this._ledgerCompact;\n }\n\n /**\n * Atomic Verifier module.\n *\n * Identity check + policy eval + CompactLedger log in a single transaction.\n * Requires an API key for platform attestation.\n *\n * @example\n * ```typescript\n * const entry = await inv.atomic.verifyAndLog({\n * action: 'swap',\n * actor: { type: 'agent', address: '0xBot' },\n * });\n * ```\n */\n get atomic(): AtomicVerifier {\n this._autoInit();\n if (!this._atomic) {\n this._atomic = new AtomicVerifier(this.contracts, this.events, this.telemetry);\n }\n return this._atomic;\n }\n\n /**\n * Verify module.\n *\n * Cryptographic verification + public explorer URLs.\n * Supports both direct call `inv.verify(txHash)` and sub-methods.\n * 7 methods: verify (callable), action, identity, escrow, proof, bulk, url\n */\n get verify(): VerifyProxy {\n this._autoInit();\n if (!this._verify) {\n const verifier = new Verifier(this.contracts, this.events, this.telemetry);\n\n // Create a callable proxy that delegates to verifier.verify()\n // while also exposing all Verifier methods as properties\n const callable = (async (txHash: string) => {\n return verifier.verify(txHash);\n }) as VerifyProxy;\n\n // Copy all Verifier methods onto the callable function\n callable.verify = verifier.verify.bind(verifier);\n callable.action = verifier.action.bind(verifier);\n callable.identity = verifier.identity.bind(verifier);\n callable.escrow = verifier.escrow.bind(verifier);\n callable.proof = verifier.proof.bind(verifier);\n callable.bulk = verifier.bulk.bind(verifier);\n callable.url = verifier.url.bind(verifier);\n callable.verifyVote = verifier.verifyVote.bind(verifier);\n\n this._verify = callable;\n }\n return this._verify;\n }\n\n /**\n * Reputation Engine module.\n *\n * Auto-calculated scores + 1-5 star reviews.\n * 7 methods: get, review, getReviews, score, compare, badge, history\n */\n get reputation(): ReputationEngine {\n this._autoInit();\n if (!this._reputation) {\n this._reputation = new ReputationEngine(this.contracts, this.events, this.telemetry);\n }\n return this._reputation;\n }\n\n /**\n * Gas management module.\n *\n * Gas abstraction (USDC-based).\n * 2 methods: estimate, balance\n */\n get gas(): GasManager {\n this._autoInit();\n if (!this._gas) {\n this._gas = new GasManager(this.contracts, this.events, this.telemetry);\n }\n return this._gas;\n }\n\n /**\n * X402 Payment Protocol module.\n *\n * Pay-per-action execution and agent-to-agent payments via x402.\n * 5 methods: payForAction, verifyPayment, history, estimateCost, configure\n */\n get x402(): X402Manager {\n this._autoInit();\n if (!this._x402) {\n this._x402 = new X402Manager(this.contracts, this.events, this.telemetry);\n }\n return this._x402;\n }\n\n /**\n * ERC-8004 (Trustless Agents) module.\n *\n * Standalone manager for on-chain agent identity, reputation, and validation.\n * Works without any Invariance contracts — just ERC-8004 registries.\n * 14 methods: register, getAgent, setMetadata, getMetadata, setAgentWallet,\n * setAgentURI, getGlobalId, giveFeedback, revokeFeedback, getSummary,\n * readFeedback, readAllFeedback, requestValidation, respondToValidation,\n * getValidationStatus, getValidationSummary\n */\n get erc8004(): ERC8004Manager {\n this._autoInit();\n if (!this._erc8004) {\n const chainId = this.contracts.getChainId();\n this._erc8004 = new ERC8004Manager({\n chainId,\n publicClient: this.contracts.getPublicClient(),\n walletClient: this.contracts.hasClients() ? this.contracts.getWalletClient() : undefined,\n });\n }\n return this._erc8004;\n }\n\n /**\n * ERC-8004 Bridge module.\n *\n * Optional bridge between ERC-8004 and Invariance modules.\n * Links identities, bridges reputation, enables cross-protocol validation.\n * 6 methods: linkIdentity, getLinkedIdentity, unlinkIdentity,\n * pullERC8004Reputation, pushFeedbackFromLedger, actAsValidator,\n * requestInvarianceValidation\n */\n get erc8004Bridge(): InvarianceBridge {\n this._autoInit();\n if (!this._erc8004Bridge) {\n this._erc8004Bridge = new InvarianceBridge(\n this.erc8004,\n this.identity,\n this.ledger,\n this.contracts,\n this.events,\n this.telemetry,\n );\n }\n return this._erc8004Bridge;\n }\n\n /**\n * Marketplace Kit module.\n *\n * Pre-built primitives for verified marketplaces: list, search, hire, complete.\n * 8 methods: register, update, deactivate, search, get, featured, hire, complete\n */\n get marketplace(): MarketplaceKit {\n this._autoInit();\n if (!this._marketplace) {\n this._marketplace = new MarketplaceKit(this.contracts, this.events, this.telemetry);\n }\n return this._marketplace;\n }\n\n /**\n * Off-chain-first audit module with optional on-chain anchoring.\n *\n * Wallet account integrations remain unchanged: actor identity and signer\n * flow still use the configured wallet/account providers.\n */\n get auditTrail(): AuditTrail {\n this._autoInit();\n if (!this._auditTrail) {\n this._auditTrail = new AuditTrail(\n this.contracts,\n this.events,\n this.telemetry,\n this.ledger,\n this.config.audit,\n );\n }\n return this._auditTrail;\n }\n\n /**\n * Off-chain batch voting with merkle root settlement.\n *\n * Create proposals on-chain, collect EIP-712 signed votes off-chain,\n * then settle with a single merkle root transaction.\n * 10 methods: createProposal, castVote, buildMerkleTree, settleVotes,\n * generateProof, verifyVote, verifyVoteOffChain, getProposal, getVotes, didPass\n */\n get voting(): VotingManager {\n this._autoInit();\n if (!this._voting) {\n this._voting = new VotingManager(this.contracts, this.events, this.telemetry);\n }\n return this._voting;\n }\n\n /**\n * Create an auto-batching compact ledger that buffers `log()` calls\n * and flushes them as a single `logBatch()` transaction for ~85% gas savings.\n *\n * @param config - Batch configuration (maxBatchSize, maxWaitMs, enabled)\n * @returns Auto-batching compact ledger wrapper\n *\n * @example\n * ```typescript\n * const batched = inv.ledgerCompactBatched({ maxBatchSize: 10, maxWaitMs: 5000 });\n * await Promise.all(events.map(e => batched.log(e))); // 1 tx instead of N\n * await batched.destroy(); // flush remaining + cleanup\n * ```\n */\n ledgerCompactBatched(config?: AutoBatchConfig): AutoBatchedEventLedgerCompact {\n this._autoInit();\n return new AutoBatchedEventLedgerCompact(this.contracts, this.events, this.telemetry, config);\n }\n\n // ===========================================================================\n // Convenience Methods (high-level workflows)\n // ===========================================================================\n\n /**\n * Register an identity, create a policy, and attach it in one call.\n *\n * @param opts - Identity and policy options\n * @returns The created identity and attached policy\n *\n * @example\n * ```typescript\n * const { identity, policy } = await inv.quickSetup({\n * identity: { type: 'agent', owner: '0xDev', label: 'TraderBot' },\n * policy: { name: 'trading-limits', rules: [{ type: 'max-spend', config: { amount: '1000' } }] },\n * });\n * ```\n */\n async quickSetup(opts: QuickSetupOptions): Promise<QuickSetupResult> {\n const identity = await this.identity.register(opts.identity);\n\n let policy: SpecPolicy;\n if (opts.policyTemplate) {\n policy = await this.policy.fromTemplate(opts.policyTemplate);\n } else if (opts.policy) {\n policy = await this.policy.create(opts.policy);\n } else {\n throw new Error('quickSetup requires either policy or policyTemplate');\n }\n\n await this.policy.attach(policy.policyId, identity.identityId);\n\n const result: QuickSetupResult = { identity, policy };\n\n if (opts.fund) {\n const walletAddress = this.wallet.getAddress();\n await this.wallet.fund(walletAddress, { amount: opts.fund.amount, token: opts.fund.token });\n result.funded = true;\n }\n\n return result;\n }\n\n /**\n * Hire from a marketplace listing and auto-fund the escrow.\n *\n * @param opts - Hire options with optional fund amount override\n * @returns Hire result with funded escrow\n *\n * @example\n * ```typescript\n * const result = await inv.hireAndFund({\n * listingId: 'listing-123',\n * task: { description: 'Label 1000 images', deadline: '2025-06-01' },\n * payment: { amount: '500', type: 'escrow' },\n * });\n * ```\n */\n async hireAndFund(opts: HireAndFundOptions): Promise<import('@invariance/common').HireResult> {\n const result = await this.marketplace.hire(opts);\n await this.escrow.fund(result.escrowId);\n return result;\n }\n\n /**\n * Register multiple agents with a shared policy in one call.\n *\n * @param opts - Batch of agents and a shared policy\n * @returns Array of registered identities with attached policies\n *\n * @example\n * ```typescript\n * const agents = await inv.batchRegister({\n * agents: [\n * { identity: { type: 'agent', owner: '0xDev', label: 'Worker-1' } },\n * { identity: { type: 'agent', owner: '0xDev', label: 'Worker-2' } },\n * ],\n * sharedPolicy: { name: 'worker-policy', rules: [{ type: 'rate-limit', config: { max: 100, window: 'PT1H' } }] },\n * });\n * ```\n */\n async batchRegister(opts: BatchRegisterOptions): Promise<BatchRegisterEntry[]> {\n const sharedPolicy = await this.policy.create(opts.sharedPolicy);\n const results: BatchRegisterEntry[] = [];\n\n for (const agent of opts.agents) {\n const identity = await this.identity.register(agent.identity);\n let policy = sharedPolicy;\n if (agent.policyOverride) {\n policy = await this.policy.create(agent.policyOverride);\n }\n await this.policy.attach(policy.policyId, identity.identityId);\n results.push({ identity, policy });\n }\n\n return results;\n }\n\n /**\n * Execute an intent and log a custom ledger event in one call.\n *\n * @param opts - Intent request options and ledger event input\n * @returns The intent result and logged ledger entry\n *\n * @example\n * ```typescript\n * const { intent, log } = await inv.executeAndLog({\n * intent: {\n * actor: { type: 'agent', address: '0xAgent' },\n * action: 'moderate',\n * params: { contentId: 'post-456' },\n * approval: 'auto',\n * },\n * log: {\n * action: 'content-moderated',\n * actor: { type: 'agent', address: '0xAgent' },\n * category: 'custom',\n * metadata: { contentId: 'post-456', verdict: 'approved' },\n * },\n * });\n * ```\n */\n async executeAndLog(opts: ExecuteAndLogOptions): Promise<ExecuteAndLogResult> {\n const intent = await this.intent.request(opts.intent);\n const log = await this.ledger.log(opts.log);\n return { intent, log };\n }\n\n /**\n * Gate any async action through SDK lifecycle + audit logging.\n *\n * Defaults to off-chain logging via infrastructure APIs. Per-action mode can\n * be overridden with `opts.mode` (`offchain`, `onchain`, or `dual`).\n */\n async gateAction<T>(opts: GateActionOptions, executor: () => Promise<T>): Promise<GateActionResult<T>> {\n return this.auditTrail.gate(opts, executor);\n }\n\n /**\n * Create a policy configured for recurring payments with time-window rules.\n *\n * @param opts - Recurring payment configuration\n * @returns The created policy\n *\n * @example\n * ```typescript\n * const policy = await inv.recurringPayment({\n * name: 'monthly-subscription',\n * amount: '50',\n * recipient: '0xService',\n * interval: 'P1M',\n * maxPayments: 12,\n * });\n * ```\n */\n async recurringPayment(opts: RecurringPaymentOptions): Promise<SpecPolicy> {\n const rules: import('@invariance/common').PolicyRule[] = [\n {\n type: 'require-payment',\n config: {\n minAmount: opts.amount,\n recipient: opts.recipient,\n perAction: true,\n },\n },\n {\n type: 'time-window',\n config: {\n interval: opts.interval,\n maxExecutions: opts.maxPayments,\n },\n },\n ];\n\n if (opts.allowedActions) {\n rules.push({\n type: 'action-whitelist',\n config: { actions: opts.allowedActions },\n });\n }\n\n const policyOpts: import('@invariance/common').CreatePolicyOptions = {\n name: opts.name,\n rules,\n };\n if (opts.actor !== undefined) policyOpts.actor = opts.actor;\n if (opts.expiry !== undefined) policyOpts.expiry = opts.expiry;\n\n return this.policy.create(policyOpts);\n }\n\n /**\n * Create a multi-sig escrow with simplified options.\n *\n * @param opts - Multi-sig escrow configuration\n * @returns The created escrow contract\n *\n * @example\n * ```typescript\n * const escrow = await inv.createMultiSig({\n * amount: '10000',\n * recipient: { type: 'agent', address: '0xAgent' },\n * signers: ['0xSigner1', '0xSigner2', '0xSigner3'],\n * threshold: 2,\n * });\n * ```\n */\n async createMultiSig(opts: CreateMultiSigOptions): Promise<EscrowContract> {\n const multiSig: import('@invariance/common').MultiSigConfig = {\n signers: opts.signers,\n threshold: opts.threshold,\n };\n if (opts.timeoutPerSigner !== undefined) multiSig.timeoutPerSigner = opts.timeoutPerSigner;\n\n const escrowOpts: import('@invariance/common').CreateEscrowOptions = {\n amount: opts.amount,\n recipient: opts.recipient,\n conditions: {\n type: 'multi-sig',\n timeout: opts.timeout ?? 'P30D',\n multiSig,\n },\n };\n if (opts.autoFund !== undefined) escrowOpts.autoFund = opts.autoFund;\n\n return this.escrow.create(escrowOpts);\n }\n\n /**\n * Register an agent with rate-limit and cooldown policies pre-configured.\n *\n * @param opts - Agent identity and rate limit configuration\n * @returns The created identity and rate-limit policy\n *\n * @example\n * ```typescript\n * const { identity, policy } = await inv.setupRateLimitedAgent({\n * identity: { type: 'agent', owner: '0xDev', label: 'SupportBot' },\n * maxActions: 100,\n * window: 'PT1H',\n * cooldown: 'PT5S',\n * allowedActions: ['reply', 'escalate', 'close'],\n * });\n * ```\n */\n async setupRateLimitedAgent(opts: SetupRateLimitedAgentOptions): Promise<QuickSetupResult> {\n const rules: import('@invariance/common').PolicyRule[] = [\n {\n type: 'rate-limit',\n config: { max: opts.maxActions, window: opts.window },\n },\n ];\n\n if (opts.cooldown) {\n rules.push({ type: 'cooldown', config: { duration: opts.cooldown } });\n }\n\n if (opts.allowedActions) {\n rules.push({ type: 'action-whitelist', config: { actions: opts.allowedActions } });\n }\n\n if (opts.maxSpend) {\n rules.push({ type: 'max-spend', config: { amount: opts.maxSpend } });\n }\n\n return this.quickSetup({\n identity: opts.identity,\n policy: {\n name: `${opts.identity.label}-rate-limit`,\n rules,\n },\n });\n }\n\n /**\n * Complete the full hire → complete → review flow in one call.\n *\n * @param opts - Hire, completion, and review options\n * @returns Combined result with hire, completion, and review data\n *\n * @example\n * ```typescript\n * const result = await inv.hireAndReview({\n * hire: {\n * listingId: 'listing-123',\n * task: { description: 'Analyze dataset', deadline: '2025-06-01' },\n * payment: { amount: '200', type: 'escrow' },\n * },\n * review: { rating: 5, comment: 'Excellent work' },\n * });\n * ```\n */\n async hireAndReview(opts: HireAndReviewOptions): Promise<HireAndReviewResult> {\n const hireAndFundOpts: HireAndFundOptions = { ...opts.hire };\n if (opts.fundAmount !== undefined) hireAndFundOpts.fundAmount = opts.fundAmount;\n const hire = await this.hireAndFund(hireAndFundOpts);\n const completion = await this.marketplace.complete(hire.hireId, {\n review: opts.review,\n });\n return {\n hire,\n completion,\n review: {\n reviewId: completion.reviewId,\n updatedReputation: completion.updatedReputation,\n },\n };\n }\n\n /**\n * Query ledger entries, optionally verify each one, and export a report.\n *\n * @param opts - Audit query filters and options\n * @returns Audit report with entries, verification results, and optional export\n *\n * @example\n * ```typescript\n * const report = await inv.audit({\n * actor: '0xAgent',\n * from: '2025-01-01',\n * to: '2025-06-01',\n * verify: true,\n * exportFormat: 'json',\n * });\n * console.log(`${report.verifiedCount}/${report.totalEntries} entries verified`);\n * ```\n */\n async audit(opts: AuditOptions): Promise<AuditReport> {\n const { verify: shouldVerify, exportFormat, ...filters } = opts;\n const entries = await this.ledger.query(filters);\n const failedVerifications: AuditReport['failedVerifications'] = [];\n let verifiedCount = 0;\n\n if (shouldVerify) {\n for (const entry of entries) {\n try {\n const result = await this.verify(entry.txHash);\n if (result.verified) {\n verifiedCount++;\n } else {\n failedVerifications.push({\n entryId: entry.entryId,\n error: 'Verification returned invalid',\n });\n }\n } catch (err) {\n failedVerifications.push({\n entryId: entry.entryId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n const report: AuditReport = {\n entries,\n totalEntries: entries.length,\n verifiedCount,\n failedVerifications,\n generatedAt: Date.now(),\n };\n\n if (exportFormat) {\n report.exported = await this.ledger.export(filters);\n }\n\n return report;\n }\n\n /**\n * Create a scoped child policy for agent-to-agent delegation.\n *\n * @param opts - Delegation scope and agent identifiers\n * @returns The delegation policy and intent recording the delegation\n *\n * @example\n * ```typescript\n * const { policy, intent } = await inv.delegate({\n * from: 'identity-orchestrator',\n * to: 'identity-worker',\n * scope: {\n * actions: ['fetch-data', 'transform'],\n * maxSpend: '50',\n * expiry: '2025-06-01T00:00:00Z',\n * },\n * });\n * ```\n */\n async delegate(opts: DelegateOptions): Promise<DelegateResult> {\n const rules: import('@invariance/common').PolicyRule[] = [\n { type: 'action-whitelist', config: { actions: opts.scope.actions } },\n ];\n\n if (opts.scope.maxSpend) {\n rules.push({ type: 'max-spend', config: { amount: opts.scope.maxSpend } });\n }\n\n if (opts.scope.additionalRules) {\n rules.push(...opts.scope.additionalRules);\n }\n\n const delegationPolicyOpts: import('@invariance/common').CreatePolicyOptions = {\n name: `delegation-${opts.from}-to-${opts.to}`,\n rules,\n };\n if (opts.scope.expiry !== undefined) delegationPolicyOpts.expiry = opts.scope.expiry;\n\n const policy = await this.policy.create(delegationPolicyOpts);\n\n await this.policy.attach(policy.policyId, opts.to);\n\n const fromIdentity = await this.identity.get(opts.from);\n const intent = await this.intent.request({\n actor: { type: fromIdentity.type, address: fromIdentity.address },\n action: 'delegate',\n params: {\n delegateTo: opts.to,\n policyId: policy.policyId,\n scope: opts.scope,\n },\n approval: 'auto',\n });\n\n return { policy, intent };\n }\n\n // ===========================================================================\n // Convenience Layer — Batch, Session, Pipeline, Hooks\n // ===========================================================================\n\n /**\n * Execute multiple operations with concurrency control and error handling.\n *\n * @param operations - Operations to execute\n * @param options - Batch execution options\n * @returns Aggregated results with success/failure counts\n *\n * @example\n * ```typescript\n * const results = await inv.batch([\n * { execute: () => inv.identity.register({...}), description: 'Register Bot1' },\n * { execute: () => inv.identity.register({...}), description: 'Register Bot2' },\n * ], { continueOnError: true, maxConcurrency: 3 });\n * ```\n */\n async batch<T = unknown>(operations: DeferredOperation<T>[], options?: BatchOptions): Promise<BatchResult<T>> {\n const executor = new BatchExecutor();\n return executor.execute(operations, options);\n }\n\n /**\n * Create a session context bound to a specific actor.\n *\n * All operations on the returned session automatically use the bound actor.\n *\n * @param options - Session options with actor reference\n * @returns Session context with actor-scoped methods\n *\n * @example\n * ```typescript\n * const session = inv.session({ actor: { type: 'agent', address: '0xBot' } });\n * await session.requestIntent({ action: 'swap', params: {...} });\n * ```\n */\n session(options: SessionOptions): SessionContext {\n return new SessionContext(this, options);\n }\n\n /**\n * Create a fluent pipeline builder for multi-step workflows.\n *\n * @returns Pipeline builder with chainable methods\n *\n * @example\n * ```typescript\n * const result = await inv.pipeline()\n * .register({ type: 'agent', label: 'Bot', owner: '0x...' })\n * .createPolicy({ template: 'defi-trading' })\n * .attachPolicy()\n * .execute();\n * ```\n */\n pipeline(): PipelineBuilder {\n return new PipelineBuilder(this);\n }\n\n /**\n * Register a callback to run before every intent action.\n *\n * @param callback - Called before each action with action details\n * @returns Unsubscribe function\n */\n beforeAction(callback: (data: import('./EventEmitter.js').InvarianceEvents['action.before']) => void): () => void {\n return this.events.on('action.before', callback);\n }\n\n /**\n * Register a callback to run after every intent action.\n *\n * @param callback - Called after each action with result details\n * @returns Unsubscribe function\n */\n afterAction(callback: (data: import('./EventEmitter.js').InvarianceEvents['action.after']) => void): () => void {\n return this.events.on('action.after', callback);\n }\n\n /**\n * Register a callback for policy violation events.\n *\n * @param callback - Called when a violation occurs\n * @returns Unsubscribe function\n */\n onViolation(callback: (data: import('./EventEmitter.js').InvarianceEvents['action.violation']) => void): () => void {\n return this.events.on('action.violation', callback);\n }\n\n /**\n * Register a callback for error events.\n *\n * @param callback - Called when an error occurs\n * @returns Unsubscribe function\n */\n onError(callback: (data: import('./EventEmitter.js').InvarianceEvents['action.error']) => void): () => void {\n return this.events.on('action.error', callback);\n }\n\n // ===========================================================================\n // Utility Methods\n // ===========================================================================\n\n /**\n * Get the raw configuration object.\n */\n getConfig(): InvarianceConfig {\n const redacted: InvarianceConfig = { ...this.config };\n delete (redacted as Partial<InvarianceConfig>).signer;\n if (redacted.apiKey) redacted.apiKey = '[REDACTED]';\n if (redacted.privy) {\n redacted.privy = { ...redacted.privy };\n if (redacted.privy.appSecret) redacted.privy.appSecret = '[REDACTED]';\n }\n return redacted;\n }\n\n /**\n * Get the current SDK version.\n */\n get version(): string {\n return SDK_VERSION;\n }\n\n /**\n * Get the chain configuration.\n */\n getChainConfig() {\n return this.contracts.getChainConfig();\n }\n\n /**\n * Get all contract addresses for the current chain.\n */\n getContractAddresses() {\n return this.contracts.getAddresses();\n }\n\n /**\n * Get the explorer base URL.\n */\n getExplorerBaseUrl(): string {\n return this.contracts.getExplorerBaseUrl();\n }\n\n /**\n * Subscribe to SDK-level events.\n *\n * @param event - Event name\n * @param listener - Callback\n * @returns Unsubscribe function\n */\n on<K extends keyof import('./EventEmitter.js').InvarianceEvents>(\n event: K,\n listener: (data: import('./EventEmitter.js').InvarianceEvents[K]) => void,\n ): () => void {\n return this.events.on(event, listener);\n }\n}\n","import type {\n InvarianceConfig,\n ContractAddresses,\n ChainConfig,\n} from '@invariance/common';\nimport {\n getChainConfig,\n getContractAddresses,\n} from '@invariance/common';\nimport { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../errors/InvarianceError.js';\nimport { type PublicClient, type WalletClient, createPublicClient, getContract as viemGetContract, http, webSocket } from 'viem';\nimport { base, baseSepolia } from 'viem/chains';\nimport {\n InvarianceIdentityAbi,\n InvariancePolicyAbi,\n InvarianceLedgerAbi,\n InvarianceIntentAbi,\n InvarianceEscrowAbi,\n InvarianceReviewAbi,\n InvarianceRegistryAbi,\n InvarianceHireAbi,\n MockUSDCAbi,\n InvarianceCompactLedgerAbi,\n InvarianceAtomicVerifierAbi,\n InvarianceVotingAbi,\n} from '../contracts/abis/index.js';\n\ntype ContractName = 'identity' | 'policy' | 'ledger' | 'intent' | 'escrow' | 'review' | 'registry' | 'hire' | 'mockUsdc' | 'compactLedger' | 'atomicVerifier' | 'voting';\n\nconst ABI_MAP = {\n identity: InvarianceIdentityAbi,\n policy: InvariancePolicyAbi,\n ledger: InvarianceLedgerAbi,\n intent: InvarianceIntentAbi,\n escrow: InvarianceEscrowAbi,\n review: InvarianceReviewAbi,\n registry: InvarianceRegistryAbi,\n hire: InvarianceHireAbi,\n mockUsdc: MockUSDCAbi,\n compactLedger: InvarianceCompactLedgerAbi,\n atomicVerifier: InvarianceAtomicVerifierAbi,\n voting: InvarianceVotingAbi,\n} as const;\n\nconst ADDRESS_KEY_MAP: Record<ContractName, keyof ContractAddresses> = {\n identity: 'identity',\n policy: 'policy',\n ledger: 'ledger',\n intent: 'intent',\n escrow: 'escrow',\n review: 'review',\n registry: 'registry',\n hire: 'hire',\n mockUsdc: 'usdc',\n compactLedger: 'compactLedger',\n atomicVerifier: 'atomicVerifier',\n voting: 'voting',\n};\n\n/**\n * Manages contract instances and blockchain connectivity.\n *\n * ContractFactory is the central point for creating and caching\n * viem PublicClient and WalletClient instances, as well as providing\n * typed contract addresses for each Invariance module.\n *\n * @example\n * ```typescript\n * const factory = new ContractFactory(config);\n * const identityAddr = factory.getAddress('identity');\n * ```\n */\nexport class ContractFactory {\n private readonly config: InvarianceConfig;\n private readonly chainConfig: ChainConfig;\n private readonly addresses: ContractAddresses;\n private publicClient: PublicClient | null = null;\n private wsPublicClient: PublicClient | null = null;\n private walletClient: WalletClient | null = null;\n\n constructor(config: InvarianceConfig) {\n this.config = config;\n\n const chainId = config.chain === 'base' ? 8453 : 84532;\n\n const chainConfig = getChainConfig(chainId);\n if (!chainConfig) {\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Unsupported chain: ${config.chain}`,\n );\n }\n this.chainConfig = chainConfig;\n\n const addresses = getContractAddresses(chainId);\n if (!addresses) {\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `No contracts deployed on chain: ${config.chain}`,\n );\n }\n this.addresses = addresses;\n\n const chain = config.chain === 'base' ? base : baseSepolia;\n const rpcUrl = config.rpcUrl ?? this.chainConfig.rpcUrl;\n const pollingInterval = config.pollingInterval ?? this.chainConfig.pollingInterval;\n this.publicClient = createPublicClient({ chain, transport: http(rpcUrl), pollingInterval }) as PublicClient;\n\n // Warn if using mainnet without API key (unsigned attestations)\n if (config.chain === 'base' && !config.apiKey) {\n console.warn('[Invariance] No API key configured. Platform attestations will use unsigned commitments. Set apiKey for production use.');\n }\n\n // Create WebSocket-backed client for faster receipt watching (instant block notifications)\n if (config.wsRpcUrl) {\n try {\n this.wsPublicClient = createPublicClient({ chain, transport: webSocket(config.wsRpcUrl), pollingInterval }) as PublicClient;\n } catch {\n // Fall back to HTTP if WS connection fails\n }\n }\n }\n\n /**\n * Get the RPC URL for the current chain.\n * Uses config override if provided, otherwise falls back to chain default.\n */\n getRpcUrl(): string {\n return this.config.rpcUrl ?? this.chainConfig.rpcUrl;\n }\n\n /**\n * Get the chain configuration.\n */\n getChainConfig(): ChainConfig {\n return this.chainConfig;\n }\n\n /**\n * Get the chain ID.\n */\n getChainId(): number {\n return this.chainConfig.id;\n }\n\n /**\n * Get all contract addresses for the current chain.\n */\n getAddresses(): ContractAddresses {\n return this.addresses;\n }\n\n /**\n * Get a specific contract address by module name.\n *\n * @param name - The contract module name\n * @returns The contract address as a hex string\n */\n getAddress(name: keyof ContractAddresses): string {\n const addr = this.addresses[name];\n if (!addr) {\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Contract address not configured: ${name}`,\n );\n }\n return addr;\n }\n\n /**\n * Get the signer/wallet from config.\n * Returns undefined if no signer is configured.\n */\n getSigner(): unknown {\n return this.config.signer;\n }\n\n /**\n * Get the API key from config (for managed hosting).\n */\n getApiKey(): string | undefined {\n return this.config.apiKey;\n }\n\n /**\n * Get the gas strategy.\n */\n getGasStrategy(): 'standard' | 'fast' | 'abstracted' | 'sponsored' {\n return this.config.gasStrategy ?? 'standard';\n }\n\n /**\n * Get the explorer base URL.\n */\n getExplorerBaseUrl(): string {\n return this.config.explorerBaseUrl ?? 'https://verify.useinvariance.com';\n }\n\n /**\n * Check whether managed mode is active (API key provided).\n */\n isManaged(): boolean {\n return this.config.apiKey !== undefined;\n }\n\n /** Set the viem clients after wallet initialization */\n setClients(publicClient: PublicClient, walletClient: WalletClient): void {\n this.publicClient = publicClient;\n this.walletClient = walletClient;\n }\n\n /**\n * Get the best available client for receipt watching.\n * Prefers WebSocket (instant block notifications) over HTTP polling.\n */\n getReceiptClient(): PublicClient {\n return this.wsPublicClient ?? this.getPublicClient();\n }\n\n /** Get the confirmation strategy. */\n getConfirmation(): 'optimistic' | 'receipt' {\n return this.config.confirmation ?? 'receipt';\n }\n\n /** Get the public client for read operations */\n getPublicClient(): PublicClient {\n if (!this.publicClient) {\n throw new InvarianceError(\n ErrorCode.WALLET_NOT_CONNECTED,\n 'Public client not initialized. Provide rpcUrl or signer in config.',\n );\n }\n return this.publicClient;\n }\n\n /** Get the wallet client for write operations */\n getWalletClient(): WalletClient {\n if (!this.walletClient) {\n throw new InvarianceError(ErrorCode.WALLET_NOT_CONNECTED, 'Wallet client not initialized. Provide a signer in config.');\n }\n return this.walletClient;\n }\n\n /** Check if clients are initialized */\n hasClients(): boolean {\n return this.publicClient !== null && this.walletClient !== null;\n }\n\n /**\n * Get a viem contract instance for the given contract name.\n *\n * @param name - The contract name\n * @returns A viem contract instance with read/write methods\n */\n getContract(name: ContractName): {\n address: `0x${string}`;\n abi: readonly unknown[];\n read: Record<string, (...args: unknown[]) => Promise<unknown>>;\n write: Record<string, (...args: unknown[]) => Promise<`0x${string}`>>;\n } {\n if (!this.publicClient) {\n throw new InvarianceError(\n ErrorCode.WALLET_NOT_CONNECTED,\n 'Public client not initialized. Provide rpcUrl or signer in config.',\n );\n }\n const abi = ABI_MAP[name];\n const addressKey = ADDRESS_KEY_MAP[name];\n const address = this.addresses[addressKey] as `0x${string}`;\n\n // The actual viem contract instance has fully typed read/write methods\n // but we use a simplified return type to avoid TS serialization limits\n const contract = viemGetContract({\n address,\n abi,\n client: this.walletClient ? { public: this.publicClient, wallet: this.walletClient } : { public: this.publicClient },\n }) as unknown as {\n address: `0x${string}`;\n abi: readonly unknown[];\n read: Record<string, (...args: unknown[]) => Promise<unknown>>;\n write: Record<string, (...args: unknown[]) => Promise<`0x${string}`>>;\n };\n\n if (this.walletClient) {\n return contract;\n }\n\n const writeProxy = new Proxy(\n {},\n {\n get() {\n throw new InvarianceError(\n ErrorCode.WALLET_NOT_CONNECTED,\n 'Wallet client not initialized. Provide a signer to perform write operations.',\n );\n },\n },\n ) as Record<string, (...args: unknown[]) => Promise<`0x${string}`>>;\n\n return {\n ...contract,\n write: writeProxy,\n };\n }\n\n /** Get the API base URL for indexer calls */\n getApiBaseUrl(): string {\n const url = this.config.apiBaseUrl\n ?? (typeof process !== 'undefined' ? process.env['INVARIANCE_API_URL'] : undefined)\n ?? (this.config.chain === 'base'\n ? 'https://api.useinvariance.com'\n : 'https://api-sepolia.useinvariance.com');\n\n // Enforce HTTPS except for localhost development\n if (!url.startsWith('https://') && !url.startsWith('http://localhost') && !url.startsWith('http://127.0.0.1')) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `API base URL must use HTTPS: ${url}. Use http:// only for localhost development.`,\n );\n }\n return url;\n }\n\n /** Get the wallet address from the wallet client */\n getWalletAddress(): string {\n const walletClient = this.getWalletClient();\n if (!walletClient.account) {\n throw new InvarianceError(ErrorCode.WALLET_NOT_CONNECTED, 'No account found in wallet client');\n }\n return walletClient.account.address;\n }\n\n /**\n * Get the EIP-712 domain for CompactLedger signatures.\n *\n * @returns EIP-712 domain with the CompactLedger contract address\n */\n getCompactLedgerDomain(): { name: string; version: string; chainId: number; verifyingContract: `0x${string}` } {\n const address = this.addresses.compactLedger;\n if (!address) {\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n 'CompactLedger contract address not configured for this chain.',\n );\n }\n return {\n name: 'InvarianceCompactLedger',\n version: '1',\n chainId: this.chainConfig.id,\n verifyingContract: address as `0x${string}`,\n };\n }\n}\n","/**\n * SDK-level event types that modules can emit.\n */\nexport interface InvarianceEvents {\n 'identity.registered': { identityId: string; address: string };\n 'identity.paused': { identityId: string };\n 'identity.resumed': { identityId: string };\n 'intent.requested': { intentId: string; action: string; requester?: string; requesterIdentityId?: string; target?: string; value?: string; mode?: string };\n 'intent.approved': { intentId: string; approver: string; approverIdentityId: string };\n 'intent.completed': { intentId: string; txHash: string; requester?: string; requesterIdentityId?: string; action?: string; value?: string };\n 'intent.rejected': { intentId: string; reason: string; rejector?: string; rejectorIdentityId?: string };\n 'policy.created': { policyId: string; name: string };\n 'policy.attached': { policyId: string; identityId: string };\n 'policy.detached': { policyId: string; identityId: string };\n 'policy.revoked': { policyId: string };\n 'policy.composed': { policyId: string; name: string };\n 'policy.violation': { policyId: string; action: string; detail: string };\n 'escrow.created': { escrowId: string; amount: string; depositor?: string; depositorIdentityId?: string; beneficiary?: string; beneficiaryIdentityId?: string; conditionType?: string };\n 'escrow.funded': { escrowId: string; funder?: string; depositor?: string; depositorIdentityId?: string; beneficiary?: string; beneficiaryIdentityId?: string; amount?: string };\n 'escrow.released': { escrowId: string; depositor?: string; depositorIdentityId?: string; beneficiary?: string; beneficiaryIdentityId?: string; amount?: string };\n 'escrow.refunded': { escrowId: string; depositor?: string; depositorIdentityId?: string; beneficiary?: string; beneficiaryIdentityId?: string; amount?: string };\n 'escrow.disputed': { escrowId: string; reason: string; disputant?: string; depositor?: string; depositorIdentityId?: string; beneficiary?: string; beneficiaryIdentityId?: string; amount?: string };\n 'escrow.resolved': { escrowId: string; depositor?: string; depositorIdentityId?: string; beneficiary?: string; beneficiaryIdentityId?: string; transferAmount?: string; releasedToBeneficiary?: boolean };\n 'ledger.logged': { entryId: string; action: string };\n 'reputation.reviewed': { reviewId: string; target: string; rating: number; reviewer?: string; reviewerIdentityId?: string; targetIdentityId?: string; escrowId?: string; commentHash?: string; categories?: Record<string, number> };\n 'marketplace.listed': { listingId: string };\n 'marketplace.hired': { hireId: string; listingId: string; hirer?: string; provider?: string; escrowId?: string; policyId?: string };\n 'marketplace.hire.completed': { hireId: string; hirer: string; provider: string; listingId: string; escrowId: string; completedAt: number };\n 'marketplace.hire.cancelled': { hireId: string; hirer: string; provider: string; listingId: string; escrowId: string };\n 'marketplace.hire.disputed': { hireId: string; disputant: string; hirer: string; provider: string; listingId: string; escrowId: string };\n 'webhook.delivered': { webhookId: string; event: string };\n 'payment.completed': { paymentId: string; action: string; amount: string };\n 'payment.failed': { action: string; reason: string };\n 'erc8004.identity.linked': { invarianceIdentityId: string; erc8004AgentId: string };\n 'erc8004.identity.unlinked': { invarianceIdentityId: string; erc8004AgentId: string };\n 'erc8004.feedback.pushed': { erc8004AgentId: string; value: number };\n 'erc8004.validation.responded': { requestHash: string; response: number };\n 'action.before': { action: string; actor: { type: string; address: string }; timestamp: number };\n 'action.after': { action: string; actor: { type: string; address: string }; durationMs: number; success: boolean; timestamp: number };\n 'action.violation': { action: string; detail: string; policyId?: string; timestamp: number };\n 'action.error': { action: string; message: string; code?: string; timestamp: number };\n 'error': { code: string; message: string };\n}\n\n/** Listener callback type */\ntype Listener<T> = (data: T) => void;\n\n/**\n * Typed event emitter for SDK-level events.\n *\n * Provides a simple pub/sub mechanism for all Invariance modules\n * to emit events and for consumers to subscribe to them.\n *\n * @example\n * ```typescript\n * const emitter = new InvarianceEventEmitter();\n * emitter.on('intent.completed', (data) => {\n * console.log(`Intent ${data.intentId} completed: ${data.txHash}`);\n * });\n * ```\n */\nexport class InvarianceEventEmitter {\n private listeners: Map<string, Set<Listener<unknown>>> = new Map();\n\n /**\n * Subscribe to an event.\n *\n * @param event - The event name to listen for\n * @param listener - Callback invoked when the event is emitted\n * @returns A function to unsubscribe\n */\n on<K extends keyof InvarianceEvents>(\n event: K,\n listener: Listener<InvarianceEvents[K]>,\n ): () => void {\n const key = event as string;\n if (!this.listeners.has(key)) {\n this.listeners.set(key, new Set());\n }\n const set = this.listeners.get(key)!;\n set.add(listener as Listener<unknown>);\n\n return () => {\n set.delete(listener as Listener<unknown>);\n if (set.size === 0) {\n this.listeners.delete(key);\n }\n };\n }\n\n /**\n * Unsubscribe from an event.\n *\n * @param event - The event name\n * @param listener - The callback to remove\n */\n off<K extends keyof InvarianceEvents>(\n event: K,\n listener: Listener<InvarianceEvents[K]>,\n ): void {\n const set = this.listeners.get(event as string);\n if (set) {\n set.delete(listener as Listener<unknown>);\n if (set.size === 0) {\n this.listeners.delete(event as string);\n }\n }\n }\n\n /**\n * Emit an event to all subscribers.\n *\n * @param event - The event name\n * @param data - The event payload\n */\n emit<K extends keyof InvarianceEvents>(\n event: K,\n data: InvarianceEvents[K],\n ): void {\n const set = this.listeners.get(event as string);\n if (set) {\n for (const listener of set) {\n try {\n listener(data);\n } catch (err) {\n // Re-emit listener errors as 'error' event so consumers can observe failures\n if (event !== 'error') {\n const hasErrorListeners = (this.listeners.get('error')?.size ?? 0) > 0;\n if (hasErrorListeners) {\n try {\n this.emit('error', {\n code: 'LISTENER_ERROR',\n message: err instanceof Error ? err.message : String(err),\n });\n } catch (errorErr) {\n // Prevent recursion if error listener itself throws\n console.warn('[Invariance] Error listener threw:', errorErr instanceof Error ? errorErr.message : String(errorErr));\n }\n } else {\n // No error listeners registered — log to console so errors aren't silently lost\n console.error(`[Invariance] Unhandled listener error on \"${event as string}\":`, err instanceof Error ? err.message : String(err));\n }\n }\n }\n }\n }\n }\n}\n","/**\n * Batch executor for running multiple operations with concurrency control.\n *\n * @example\n * ```typescript\n * const results = await inv.batch([\n * { execute: () => inv.identity.register({...}), description: 'Register Bot1' },\n * { execute: () => inv.identity.register({...}), description: 'Register Bot2' },\n * ], { continueOnError: true, maxConcurrency: 3 });\n * ```\n */\nimport type { DeferredOperation, BatchOptions, BatchResult } from './convenience-types.js';\n\n/**\n * Execute a batch of operations with concurrency control and error handling.\n */\nexport class BatchExecutor {\n /**\n * Execute operations with configurable concurrency and error handling.\n *\n * @param operations - Operations to execute\n * @param options - Batch execution options\n * @returns Aggregated results with success/failure counts\n */\n async execute<T = unknown>(\n operations: DeferredOperation<T>[],\n options: BatchOptions = {},\n ): Promise<BatchResult<T>> {\n const { continueOnError = false, maxConcurrency = 5 } = options;\n const results: Array<{ index: number; description: string; result: T }> = [];\n const failures: Array<{ index: number; description: string; error: string }> = [];\n\n // Process in chunks based on concurrency\n for (let i = 0; i < operations.length; i += maxConcurrency) {\n const chunk = operations.slice(i, i + maxConcurrency);\n const promises = chunk.map(async (op, chunkIdx) => {\n const idx = i + chunkIdx;\n try {\n const result = await op.execute();\n results.push({ index: idx, description: op.description, result });\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n failures.push({ index: idx, description: op.description, error });\n if (!continueOnError) {\n throw err;\n }\n }\n });\n\n try {\n await Promise.all(promises);\n } catch {\n if (!continueOnError) break;\n }\n }\n\n return {\n results,\n failures,\n successCount: results.length,\n failureCount: failures.length,\n totalCount: operations.length,\n };\n }\n}\n","/**\n * Session context that binds an actor to all operations,\n * eliminating repetitive actor passing.\n *\n * @example\n * ```typescript\n * const session = inv.session({ actor: { type: 'agent', address: '0xBot' } });\n * await session.requestIntent({ action: 'swap', params: {...} });\n * await session.myActions({ limit: 50 });\n * ```\n */\nimport type { Invariance } from './InvarianceClient.js';\nimport type { ActorReference, IntentRequestOptions, IntentResult, LedgerEntry, SpecPolicy } from '@invariance/common';\nimport type { SessionOptions } from './convenience-types.js';\nimport type { IntentHistoryFilters } from '../modules/intent/types.js';\nimport type { LedgerQueryFilters } from '../modules/ledger/types.js';\nimport type { PolicyListFilters } from '../modules/policy/types.js';\n\n/**\n * A session scoped to a specific actor.\n *\n * All operations automatically use the bound actor, removing the need\n * to pass actor references repeatedly.\n */\nexport class SessionContext {\n private readonly inv: Invariance;\n /** The actor bound to this session */\n readonly actor: ActorReference;\n\n constructor(inv: Invariance, options: SessionOptions) {\n this.inv = inv;\n this.actor = options.actor;\n }\n\n /**\n * Request an intent with the session actor pre-filled.\n *\n * @param opts - Intent options (actor is auto-filled)\n * @returns Intent result\n */\n async requestIntent(opts: Omit<IntentRequestOptions, 'actor'>): Promise<IntentResult> {\n return this.inv.intent.request({ ...opts, actor: this.actor });\n }\n\n /**\n * Query the session actor's action history.\n *\n * @param filters - Optional additional filters\n * @returns Array of intent results\n */\n async myActions(filters?: Omit<IntentHistoryFilters, 'actor'>): Promise<IntentResult[]> {\n return this.inv.intent.history({ ...filters, actor: this.actor.address });\n }\n\n /**\n * Query ledger entries for the session actor.\n *\n * @param filters - Optional additional filters\n * @returns Array of ledger entries\n */\n async myLedgerEntries(filters?: Omit<LedgerQueryFilters, 'actor'>): Promise<LedgerEntry[]> {\n return this.inv.ledger.query({ ...filters, actor: this.actor.address });\n }\n\n /**\n * List policies attached to the session actor's identity.\n *\n * @param filters - Optional additional filters\n * @returns Array of policies\n */\n async myPolicies(filters?: Omit<PolicyListFilters, 'identityId'>): Promise<SpecPolicy[]> {\n return this.inv.policy.list({ ...filters, identityId: this.actor.address });\n }\n}\n","/**\n * Pre-built policy templates for common agent use cases.\n *\n * Templates provide sensible defaults that can be customized via overrides.\n *\n * @example\n * ```typescript\n * const policy = await inv.policy.fromTemplate('defi-trading', { expiry: '2025-12-31' });\n * ```\n */\nimport type { CreatePolicyOptions, PolicyRule } from '@invariance/common';\nimport type { PolicyTemplate, BuiltInTemplate } from './types.js';\n\n/** Built-in template definitions */\nconst BUILT_IN_TEMPLATES: Record<BuiltInTemplate, PolicyTemplate> = {\n 'conservative-spending': {\n name: 'conservative-spending',\n description: 'Conservative spending limits: $100 daily, business hours only, basic operations',\n builtin: true,\n rules: [\n { type: 'max-spend', config: { amount: '100', period: '24h' } },\n { type: 'time-window', config: { start: '09:00', end: '17:00', timezone: 'UTC' } },\n { type: 'action-whitelist', config: { actions: ['transfer', 'approve', 'query', 'balance'] } },\n ],\n },\n 'defi-trading': {\n name: 'defi-trading',\n description: 'DeFi trading profile: $10k daily limit, swap/approve/deposit/withdraw actions',\n builtin: true,\n rules: [\n { type: 'max-spend', config: { amount: '10000', period: '24h' } },\n { type: 'action-whitelist', config: { actions: ['swap', 'approve', 'deposit', 'withdraw', 'query', 'balance'] } },\n ],\n },\n 'content-agent': {\n name: 'content-agent',\n description: 'Content management agent: post/edit/delete, no spending, rate limited',\n builtin: true,\n rules: [\n { type: 'max-spend', config: { amount: '0' } },\n { type: 'action-whitelist', config: { actions: ['post', 'edit', 'delete', 'query', 'moderate'] } },\n { type: 'rate-limit', config: { max: 100, window: 'PT1H' } },\n ],\n },\n 'research-agent': {\n name: 'research-agent',\n description: 'Read-only research agent: no spending, no writes, query and analysis only',\n builtin: true,\n rules: [\n { type: 'max-spend', config: { amount: '0' } },\n { type: 'action-whitelist', config: { actions: ['query', 'analyze', 'search', 'read', 'export'] } },\n ],\n },\n 'full-autonomy': {\n name: 'full-autonomy',\n description: 'Full autonomy: high limits, all actions allowed. Use with caution.',\n builtin: true,\n rules: [\n { type: 'max-spend', config: { amount: '100000', period: '24h' } },\n ],\n },\n 'mev-bot': {\n name: 'mev-bot',\n description: 'MEV bot: $50k daily, swap/arbitrage/liquidate/flashloan, high rate limit',\n builtin: true,\n rules: [\n { type: 'max-spend', config: { amount: '50000', period: '24h' } },\n { type: 'action-whitelist', config: { actions: ['swap', 'arbitrage', 'liquidate', 'flashloan'] } },\n { type: 'rate-limit', config: { max: 1000, window: 'PT1H' } },\n ],\n },\n 'social-agent': {\n name: 'social-agent',\n description: 'Social agent: no spending, post/reply/moderate, rate limited with cooldown',\n builtin: true,\n rules: [\n { type: 'max-spend', config: { amount: '0' } },\n { type: 'action-whitelist', config: { actions: ['post', 'reply', 'like', 'share', 'moderate', 'report'] } },\n { type: 'rate-limit', config: { max: 200, window: 'PT1H' } },\n { type: 'cooldown', config: { duration: 'PT30S' } },\n ],\n },\n 'cross-chain-bridge': {\n name: 'cross-chain-bridge',\n description: 'Cross-chain bridge: $25k daily, bridge/swap/approve/claim operations',\n builtin: true,\n rules: [\n { type: 'max-spend', config: { amount: '25000', period: '24h' } },\n { type: 'action-whitelist', config: { actions: ['bridge', 'swap', 'approve', 'claim', 'query'] } },\n ],\n },\n 'payment-delegation': {\n name: 'payment-delegation',\n description: 'Payment delegation: $5k daily, transfer/approve/schedule, business hours only',\n builtin: true,\n rules: [\n { type: 'max-spend', config: { amount: '5000', period: '24h' } },\n { type: 'action-whitelist', config: { actions: ['transfer', 'approve', 'schedule', 'cancel'] } },\n { type: 'time-window', config: { start: '09:00', end: '17:00', timezone: 'UTC' } },\n ],\n },\n 'iot-device': {\n name: 'iot-device',\n description: 'IoT device: zero spending, read-only operations, high rate limit',\n builtin: true,\n rules: [\n { type: 'max-spend', config: { amount: '0' } },\n { type: 'action-whitelist', config: { actions: ['read', 'query', 'report', 'ping', 'status'] } },\n { type: 'rate-limit', config: { max: 10000, window: 'PT1H' } },\n ],\n },\n 'government-benefits': {\n name: 'government-benefits',\n description: 'Government benefits: $10k daily, distribute/verify/audit, daytime hours',\n builtin: true,\n rules: [\n { type: 'max-spend', config: { amount: '10000', period: '24h' } },\n { type: 'action-whitelist', config: { actions: ['distribute', 'verify-eligibility', 'audit', 'query', 'attest'] } },\n { type: 'time-window', config: { start: '06:00', end: '22:00', timezone: 'UTC' } },\n ],\n },\n 'identity-verifier': {\n name: 'identity-verifier',\n description: 'Identity verifier: no spending, verify/revoke/attest/audit, rate limited',\n builtin: true,\n rules: [\n { type: 'max-spend', config: { amount: '0' } },\n { type: 'action-whitelist', config: { actions: ['verify', 'revoke', 'query', 'attest', 'audit'] } },\n { type: 'rate-limit', config: { max: 500, window: 'PT1H' } },\n ],\n },\n};\n\n/** Custom templates registered at runtime */\nconst customTemplates = new Map<string, PolicyTemplate>();\n\n/**\n * Resolve a template by name, checking custom templates first then built-ins.\n */\nexport function getTemplate(name: string): PolicyTemplate | undefined {\n return customTemplates.get(name) ?? BUILT_IN_TEMPLATES[name as BuiltInTemplate];\n}\n\n/**\n * Register a custom template.\n */\nexport function defineTemplate(name: string, template: Omit<PolicyTemplate, 'name' | 'builtin'>): void {\n customTemplates.set(name, { ...template, name, builtin: false });\n}\n\n/**\n * List all available templates (built-in + custom).\n */\nexport function listTemplates(): Array<{ name: string; description: string; builtin: boolean }> {\n const results: Array<{ name: string; description: string; builtin: boolean }> = [];\n\n for (const [name, tmpl] of Object.entries(BUILT_IN_TEMPLATES)) {\n results.push({ name, description: tmpl.description, builtin: true });\n }\n\n for (const [name, tmpl] of customTemplates) {\n results.push({ name, description: tmpl.description, builtin: false });\n }\n\n return results;\n}\n\n/**\n * Build CreatePolicyOptions from a template name with optional overrides.\n */\nexport function buildPolicyFromTemplate(\n templateName: string,\n overrides?: { expiry?: string; actor?: import('@invariance/common').ActorType | import('@invariance/common').ActorType[]; additionalRules?: PolicyRule[] },\n): CreatePolicyOptions {\n const template = getTemplate(templateName);\n if (!template) {\n throw new Error(`Unknown policy template: \"${templateName}\". Use listTemplates() to see available templates.`);\n }\n\n const rules: PolicyRule[] = [...template.rules];\n if (overrides?.additionalRules) {\n rules.push(...overrides.additionalRules);\n }\n\n const opts: CreatePolicyOptions = {\n name: template.name,\n rules,\n };\n\n if (overrides?.expiry) opts.expiry = overrides.expiry;\n if (overrides?.actor) opts.actor = overrides.actor;\n\n return opts;\n}\n","/**\n * Fluent pipeline builder for multi-step workflows with auto-linked context.\n *\n * @example\n * ```typescript\n * const result = await inv.pipeline()\n * .register({ type: 'agent', label: 'Bot', owner: '0x...' })\n * .createPolicy({ template: 'defi-trading' })\n * .attachPolicy()\n * .fundWallet({ amount: '100' })\n * .execute();\n * ```\n */\nimport type { Invariance } from './InvarianceClient.js';\nimport type { RegisterIdentityOptions, CreatePolicyOptions } from '@invariance/common';\nimport type { PipelineResult, PipelineStep } from './convenience-types.js';\nimport { buildPolicyFromTemplate } from '../modules/policy/templates.js';\n\n/** Shared context passed between pipeline steps */\ntype PipelineContext = Map<string, unknown>;\n\n/** A step definition in the pipeline */\ninterface StepDef {\n name: string;\n fn: (ctx: PipelineContext, inv: Invariance) => Promise<unknown>;\n}\n\n/**\n * Fluent builder for multi-step agent workflows.\n *\n * Steps store results in a shared context map. Later steps auto-read\n * values (like identityId, policyId) from context.\n */\nexport class PipelineBuilder {\n private readonly inv: Invariance;\n private readonly steps: StepDef[] = [];\n\n constructor(inv: Invariance) {\n this.inv = inv;\n }\n\n /**\n * Register an identity. Stores `identityId` and `identity` in context.\n */\n register(opts: RegisterIdentityOptions): this {\n this.steps.push({\n name: 'register',\n fn: async (ctx) => {\n const identity = await this.inv.identity.register(opts);\n ctx.set('identityId', identity.identityId);\n ctx.set('identity', identity);\n return identity;\n },\n });\n return this;\n }\n\n /**\n * Create a policy. Accepts either a template name or full options.\n * Stores `policyId` and `policy` in context.\n */\n createPolicy(opts: { template: string; expiry?: string } | CreatePolicyOptions): this {\n this.steps.push({\n name: 'createPolicy',\n fn: async (ctx) => {\n let policyOpts: CreatePolicyOptions;\n if ('template' in opts) {\n const overrides = opts.expiry ? { expiry: opts.expiry } : undefined;\n policyOpts = buildPolicyFromTemplate(opts.template, overrides);\n } else {\n policyOpts = opts;\n }\n const policy = await this.inv.policy.create(policyOpts);\n ctx.set('policyId', policy.policyId);\n ctx.set('policy', policy);\n return policy;\n },\n });\n return this;\n }\n\n /**\n * Attach the policy from context to the identity from context.\n * Auto-reads `policyId` and `identityId` from previous steps.\n */\n attachPolicy(policyId?: string, identityId?: string): this {\n this.steps.push({\n name: 'attachPolicy',\n fn: async (ctx) => {\n const pid = policyId ?? ctx.get('policyId') as string;\n const iid = identityId ?? ctx.get('identityId') as string;\n if (!pid) throw new Error('attachPolicy: no policyId in context. Run createPolicy() first.');\n if (!iid) throw new Error('attachPolicy: no identityId in context. Run register() first.');\n return this.inv.policy.attach(pid, iid);\n },\n });\n return this;\n }\n\n /**\n * Fund the wallet with a specified amount.\n */\n fundWallet(opts: { amount: string; token?: 'USDC' }): this {\n this.steps.push({\n name: 'fundWallet',\n fn: async () => {\n const address = this.inv.wallet.getAddress();\n return this.inv.wallet.fund(address, { amount: opts.amount, token: opts.token });\n },\n });\n return this;\n }\n\n /**\n * Add a custom step with access to the pipeline context.\n */\n custom(name: string, fn: (ctx: PipelineContext) => Promise<unknown>): this {\n this.steps.push({ name, fn: async (ctx) => fn(ctx) });\n return this;\n }\n\n /**\n * Execute all pipeline steps sequentially.\n * Stops on first error with full step-by-step reporting.\n *\n * @returns Pipeline result with success status, step results, and context\n */\n async execute(): Promise<PipelineResult> {\n const ctx: PipelineContext = new Map();\n const stepResults: PipelineStep[] = [];\n\n for (const step of this.steps) {\n const startTime = Date.now();\n try {\n const result = await step.fn(ctx, this.inv);\n stepResults.push({\n name: step.name,\n success: true,\n result,\n durationMs: Date.now() - startTime,\n });\n } catch (err) {\n stepResults.push({\n name: step.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startTime,\n });\n return {\n success: false,\n steps: stepResults,\n context: Object.fromEntries(ctx),\n };\n }\n }\n\n return {\n success: true,\n steps: stepResults,\n context: Object.fromEntries(ctx),\n };\n }\n}\n","/**\n * Anonymized telemetry collector for SDK usage metrics.\n *\n * When enabled, collects non-identifying usage data such as method call counts,\n * error rates, and latency distributions. All data is anonymized and contains\n * no wallet addresses, transaction hashes, or personally identifiable information.\n *\n * Telemetry is opt-out: enabled by default but can be disabled via config.\n */\nexport class Telemetry {\n private readonly enabled: boolean;\n private buffer: TelemetryEvent[] = [];\n private static readonly MAX_BUFFER_SIZE = 100;\n\n constructor(enabled: boolean) {\n this.enabled = enabled;\n }\n\n /**\n * Track an anonymized telemetry event.\n *\n * @param event - Event name (e.g., 'identity.register', 'intent.request')\n * @param data - Anonymized event data (no PII, no addresses, no hashes)\n */\n track(event: string, data?: Record<string, unknown>): void {\n if (!this.enabled) return;\n\n this.buffer.push({\n event,\n data: data ?? {},\n timestamp: Date.now(),\n });\n\n // Auto-flush when buffer is full\n if (this.buffer.length >= Telemetry.MAX_BUFFER_SIZE) {\n void this.flush();\n }\n }\n\n /**\n * Flush buffered telemetry events.\n *\n * In V1 this is a no-op stub. Future versions will send to\n * the Invariance telemetry endpoint.\n */\n async flush(): Promise<void> {\n if (!this.enabled || this.buffer.length === 0) return;\n\n // TODO: Send to telemetry endpoint in V2\n // const events = [...this.buffer];\n this.buffer = [];\n }\n}\n\n/** Internal telemetry event structure */\ninterface TelemetryEvent {\n event: string;\n data: Record<string, unknown>;\n timestamp: number;\n}\n","import { privateKeyToAccount } from 'viem/accounts';\nimport type { InvarianceConfig } from '@invariance/common';\n\nconst hasProcessEnv = typeof process !== 'undefined' && typeof process.env !== 'undefined';\n\n// Load dotenv if available (dev/example usage only — not a runtime dependency)\nif (hasProcessEnv) {\n void import('dotenv')\n .then((dotenv) => {\n dotenv.config();\n })\n .catch(() => {\n // dotenv not installed — environment variables must be set externally\n });\n}\n\nconst VALID_CHAINS = ['base', 'base-sepolia'] as const;\n\n/**\n * Load SDK configuration from environment variables.\n *\n * Supported variables:\n * - `INVARIANCE_PRIVATE_KEY` — hex private key, converted to a viem account signer\n * - `INVARIANCE_RPC_URL` — JSON-RPC endpoint\n * - `INVARIANCE_CHAIN` — `\"base\"` or `\"base-sepolia\"`\n * - `INVARIANCE_API_KEY` — managed-mode API key\n *\n * Only fields with a corresponding env var present are included in the\n * returned partial config.\n *\n * Note: `dotenv` is loaded opportunistically. If it is not installed,\n * environment variables must be set by the host process.\n */\nexport function loadEnvConfig(): Partial<InvarianceConfig> {\n const config: Partial<InvarianceConfig> = {};\n\n if (!hasProcessEnv) {\n return config;\n }\n\n const privateKey = process.env['INVARIANCE_PRIVATE_KEY'];\n if (privateKey) {\n const key = privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`;\n config.signer = privateKeyToAccount(key as `0x${string}`);\n }\n\n const rpcUrl = process.env['INVARIANCE_RPC_URL'];\n if (rpcUrl) {\n config.rpcUrl = rpcUrl;\n }\n\n const chain = process.env['INVARIANCE_CHAIN'];\n if (chain) {\n if (!VALID_CHAINS.includes(chain as (typeof VALID_CHAINS)[number])) {\n throw new Error(\n `Invalid INVARIANCE_CHAIN=\"${chain}\". Must be one of: ${VALID_CHAINS.join(', ')}`,\n );\n }\n config.chain = chain as 'base' | 'base-sepolia';\n }\n\n const apiKey = process.env['INVARIANCE_API_KEY'];\n if (apiKey) {\n config.apiKey = apiKey;\n }\n\n return config;\n}\n","import { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../errors/InvarianceError.js';\n\n/** Default timeout for indexer requests (5 seconds) */\nconst DEFAULT_TIMEOUT = 5000;\n\n/** Maximum retries on 5xx errors */\nconst MAX_RETRIES = 1;\n\n/**\n * Lightweight fetch wrapper for the Invariance indexer REST API.\n *\n * Built-in timeout, retry on 5xx, and graceful degradation.\n * Used by modules that need paginated/filtered read queries.\n */\nexport class IndexerClient {\n private readonly baseUrl: string;\n private readonly apiKey: string | undefined;\n private readonly hasV1Prefix: boolean;\n\n constructor(baseUrl: string, apiKey?: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n this.apiKey = apiKey;\n this.hasV1Prefix = this.baseUrl.endsWith('/v1');\n }\n\n /**\n * Perform a GET request to the indexer API.\n *\n * @param path - The API path (e.g., '/identities')\n * @param params - Optional query parameters\n * @returns The parsed JSON response\n */\n async get<T>(path: string, params?: Record<string, string | number | undefined>): Promise<T> {\n const url = new URL(this.buildUrl(path, true));\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);\n\n const response = await fetch(url.toString(), {\n signal: controller.signal,\n headers: this.buildHeaders(),\n });\n\n clearTimeout(timeout);\n\n if (response.ok) {\n const payload = await response.json() as unknown;\n if (payload && typeof payload === 'object' && 'data' in (payload as Record<string, unknown>)) {\n return (payload as { data: T }).data;\n }\n return payload as T;\n }\n\n // Retry on 5xx\n if (response.status >= 500 && attempt < MAX_RETRIES) {\n lastError = new Error(`Indexer returned ${response.status}`);\n continue;\n }\n\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Indexer request failed: ${response.status} ${response.statusText}`,\n );\n } catch (err) {\n if (err instanceof InvarianceError) throw err;\n lastError = err;\n if (attempt < MAX_RETRIES) continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Indexer unavailable: ${lastError instanceof Error ? lastError.message : 'unknown error'}`,\n );\n }\n\n /**\n * Perform a POST request to the indexer/API.\n *\n * @param path - API path\n * @param body - JSON request body\n * @returns Parsed JSON response body\n */\n async post<T>(path: string, body: Record<string, unknown>): Promise<T> {\n const url = this.buildUrl(path, true);\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);\n\n const response = await fetch(url, {\n method: 'POST',\n signal: controller.signal,\n headers: {\n ...this.buildHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n clearTimeout(timeout);\n\n if (response.ok) {\n const payload = await response.json() as unknown;\n if (payload && typeof payload === 'object' && 'data' in (payload as Record<string, unknown>)) {\n return (payload as { data: T }).data;\n }\n return payload as T;\n }\n\n if (response.status >= 500 && attempt < MAX_RETRIES) {\n lastError = new Error(`Indexer returned ${response.status}`);\n continue;\n }\n\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Indexer request failed: ${response.status} ${response.statusText}`,\n );\n } catch (err) {\n if (err instanceof InvarianceError) throw err;\n lastError = err;\n if (attempt < MAX_RETRIES) continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Indexer unavailable: ${lastError instanceof Error ? lastError.message : 'unknown error'}`,\n );\n }\n\n /**\n * Perform a GET request and return both data and metadata (including total count).\n *\n * @param path - The API path\n * @param params - Optional query parameters\n * @returns Object with data array and total count\n */\n async getPaginated<T>(path: string, params?: Record<string, string | number | undefined>): Promise<{ data: T[]; total: number }> {\n const url = new URL(this.buildUrl(path, true));\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);\n\n const response = await fetch(url.toString(), {\n signal: controller.signal,\n headers: this.buildHeaders(),\n });\n\n clearTimeout(timeout);\n\n if (response.ok) {\n const payload = await response.json() as unknown;\n if (payload && typeof payload === 'object') {\n const obj = payload as Record<string, unknown>;\n const data = (Array.isArray(obj['data']) ? obj['data'] : []) as T[];\n const meta = obj['meta'] as Record<string, unknown> | undefined;\n const total = typeof meta?.['total'] === 'number' ? meta['total'] as number : data.length;\n return { data, total };\n }\n return { data: [] as T[], total: 0 };\n }\n\n if (response.status >= 500 && attempt < MAX_RETRIES) {\n lastError = new Error(`Indexer returned ${response.status}`);\n continue;\n }\n\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Indexer request failed: ${response.status} ${response.statusText}`,\n );\n } catch (err) {\n if (err instanceof InvarianceError) throw err;\n lastError = err;\n if (attempt < MAX_RETRIES) continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Indexer unavailable: ${lastError instanceof Error ? lastError.message : 'unknown error'}`,\n );\n }\n\n /**\n * Check if the indexer API is reachable.\n *\n * @returns true if the indexer responds to a health check\n */\n async isAvailable(): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);\n\n const response = await fetch(this.buildUrl('/health', false), {\n signal: controller.signal,\n headers: this.buildHeaders(),\n });\n\n clearTimeout(timeout);\n return response.ok;\n } catch {\n return false;\n }\n }\n\n /** Build common headers, including api key when configured. */\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = { 'Accept': 'application/json' };\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n headers['x-api-key'] = this.apiKey;\n }\n return headers;\n }\n\n /** Build a fully qualified URL with optional /v1 prefix */\n private buildUrl(path: string, useV1: boolean): string {\n const normalized = path.startsWith('/') ? path : `/${path}`;\n if (!useV1) {\n return `${this.baseUrl}${normalized}`;\n }\n if (this.hasV1Prefix) {\n return `${this.baseUrl}${normalized.startsWith('/v1') ? normalized.slice(3) : normalized}`;\n }\n return `${this.baseUrl}${normalized.startsWith('/v1') ? normalized : `/v1${normalized}`}`;\n }\n}\n","import type {\n ActorType,\n ActorReference,\n Identity,\n LedgerEntry,\n IntentResult,\n ProofBundle,\n SpecPolicy,\n EscrowContract,\n Listing,\n ReputationScore,\n Review,\n ReviewSummary,\n} from '@invariance/common';\n\nconst ACTOR_TYPES: ActorType[] = ['agent', 'human', 'device', 'service'];\n\nfunction toNumber(value: unknown, fallback = 0): number {\n if (typeof value === 'number' && !Number.isNaN(value)) return value;\n if (typeof value === 'string') {\n const parsed = Number(value);\n if (!Number.isNaN(parsed)) return parsed;\n }\n return fallback;\n}\n\nexport function toTimestamp(value: unknown): number {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'number') {\n return value > 1e12 ? value : Math.floor(value * 1000);\n }\n if (typeof value === 'string') {\n const parsed = Date.parse(value);\n if (!Number.isNaN(parsed)) return parsed;\n const asNumber = Number(value);\n if (!Number.isNaN(asNumber)) {\n return asNumber > 1e12 ? asNumber : Math.floor(asNumber * 1000);\n }\n }\n return 0;\n}\n\nfunction normalizeActorType(value: unknown): ActorType {\n if (typeof value === 'string' && ACTOR_TYPES.includes(value as ActorType)) {\n return value as ActorType;\n }\n return 'agent';\n}\n\nfunction normalizeActorArray(value: unknown): ActorType[] {\n if (!Array.isArray(value)) return [];\n return value\n .map((item) => (typeof item === 'string' ? item : String(item)))\n .map((item) => (ACTOR_TYPES.includes(item as ActorType) ? (item as ActorType) : null))\n .filter((v): v is ActorType => v !== null);\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.map((item) => String(item));\n}\n\nfunction parseJson(value: unknown): Record<string, unknown> | undefined {\n if (!value) return undefined;\n if (typeof value === 'object') return value as Record<string, unknown>;\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n\nexport function mapIdentityRow(row: Record<string, unknown>, explorerBase: string): Identity {\n const identityId = String(row['identity_id'] ?? row['identityId'] ?? '');\n const address = String(row['address'] ?? '');\n const createdAt = toTimestamp(row['created_at'] ?? row['createdAt']);\n\n return {\n identityId,\n type: normalizeActorType(row['actor_type'] ?? row['actorType']),\n address,\n owner: String(row['owner'] ?? ''),\n label: String(row['label'] ?? ''),\n capabilities: normalizeStringArray(row['capabilities']),\n status: (row['status'] as Identity['status']) ?? 'active',\n attestations: toNumber(row['attestation_count'] ?? row['attestationCount']),\n createdAt,\n txHash: String(row['tx_hash'] ?? row['txHash'] ?? ''),\n explorerUrl: identityId ? `${explorerBase}/identity/${identityId}` : '',\n };\n}\n\nexport function mapPolicyRow(row: Record<string, unknown>): SpecPolicy {\n const rules = row['rules'];\n const actorTypes = normalizeActorArray(row['actor_types'] ?? row['actorTypes']);\n const actor: SpecPolicy['actor'] = actorTypes.length === 0\n ? null\n : actorTypes.length === 1\n ? actorTypes[0]!\n : actorTypes;\n\n return {\n policyId: String(row['policy_id'] ?? row['policyId'] ?? ''),\n name: String(row['name'] ?? ''),\n rules: Array.isArray(rules) ? rules : (rules ? (rules as unknown[]) : []),\n actor,\n state: (row['state'] as SpecPolicy['state']) ?? 'active',\n attachedTo: normalizeStringArray(row['attached_to']),\n createdAt: toTimestamp(row['created_at'] ?? row['createdAt']),\n txHash: String(row['tx_hash'] ?? row['txHash'] ?? ''),\n };\n}\n\nexport function mapProof(row: Record<string, unknown>): ProofBundle {\n const proofHash = String(row['proof_hash'] ?? row['proofHash'] ?? '');\n const metadataHash = String(row['metadata_hash'] ?? row['metadataHash'] ?? row['params_hash'] ?? '');\n\n return {\n proofHash,\n signatures: {\n actor: '',\n platform: '',\n valid: Boolean(proofHash),\n },\n metadataHash,\n verifiable: Boolean(proofHash),\n raw: '',\n };\n}\n\nexport function mapLedgerRow(row: Record<string, unknown>, explorerBase: string): LedgerEntry {\n const entryId = String(row['entry_id'] ?? row['entryId'] ?? '');\n const txHash = String(row['tx_hash'] ?? row['txHash'] ?? '');\n\n const actor: ActorReference = {\n type: normalizeActorType(row['actor_type'] ?? row['actorType']),\n address: String(row['actor_address'] ?? row['actorAddress'] ?? ''),\n };\n const actorIdentityId = row['actor_identity_id'];\n if (actorIdentityId) actor.identityId = String(actorIdentityId);\n\n return {\n entryId,\n action: String(row['action'] ?? ''),\n actor,\n category: String(row['category'] ?? ''),\n txHash,\n blockNumber: toNumber(row['block_number'] ?? row['blockNumber']),\n timestamp: toTimestamp(row['timestamp']),\n proof: mapProof(row),\n metadataHash: String(row['metadata_hash'] ?? row['metadataHash'] ?? ''),\n explorerUrl: txHash ? `${explorerBase}/tx/${txHash}` : '',\n ...(parseJson(row['metadata']) ? { metadata: parseJson(row['metadata']) } : {}),\n } as LedgerEntry;\n}\n\nexport function mapIntentRow(row: Record<string, unknown>, explorerBase: string): IntentResult {\n const intentId = String(row['intent_id'] ?? row['intentId'] ?? '');\n const txHash = String(row['tx_hash'] ?? row['txHash'] ?? '');\n\n return {\n intentId,\n status: (row['status'] as IntentResult['status']) ?? 'pending',\n actor: (() => {\n const actor: ActorReference = {\n type: normalizeActorType(row['actor_type'] ?? row['actorType']),\n address: String(row['actor_address'] ?? row['actorAddress'] ?? ''),\n };\n const identityId = row['actor_identity_id'];\n if (identityId) actor.identityId = String(identityId);\n return actor;\n })(),\n action: String(row['action'] ?? ''),\n proof: mapProof(row),\n txHash,\n timestamp: toTimestamp(row['created_at'] ?? row['createdAt']),\n blockNumber: toNumber(row['block_number'] ?? row['blockNumber']),\n explorerUrl: txHash ? `${explorerBase}/tx/${txHash}` : '',\n logId: intentId,\n };\n}\n\nexport function mapEscrowRow(row: Record<string, unknown>, explorerBase: string): EscrowContract {\n const escrowId = String(row['escrow_id'] ?? row['escrowId'] ?? '');\n const txHash = String(row['tx_hash'] ?? row['txHash'] ?? '');\n const conditionType = String(row['condition_type'] ?? row['conditionType'] ?? 'task-completion');\n\n return {\n escrowId,\n contractAddress: String(row['contract_address'] ?? row['contractAddress'] ?? ''),\n depositor: (() => {\n const actor: ActorReference = {\n type: normalizeActorType(row['depositor_actor_type']),\n address: String(row['depositor'] ?? ''),\n };\n const identityId = row['depositor_identity'];\n if (identityId) actor.identityId = String(identityId);\n return actor;\n })(),\n recipient: (() => {\n const actor: ActorReference = {\n type: normalizeActorType(row['recipient_actor_type']),\n address: String(row['recipient'] ?? ''),\n };\n const identityId = row['recipient_identity'];\n if (identityId) actor.identityId = String(identityId);\n return actor;\n })(),\n amount: String(row['amount'] ?? '0'),\n state: (row['state'] as EscrowContract['state']) ?? 'created',\n conditions: (() => {\n const conditions: EscrowContract['conditions'] = {\n type: conditionType as EscrowContract['conditions']['type'],\n timeout: String(row['timeout_seconds'] ?? row['timeoutSeconds'] ?? '0'),\n };\n if (row['arbiter']) conditions.arbiter = String(row['arbiter']);\n if (row['linked_policy_id']) conditions.linkedPolicyId = String(row['linked_policy_id']);\n return conditions;\n })(),\n createdAt: toTimestamp(row['created_at'] ?? row['createdAt']),\n txHash,\n explorerUrl: txHash ? `${explorerBase}/tx/${txHash}` : '',\n };\n}\n\nexport function mapReputationScoreRow(row: Record<string, unknown>): ReputationScore {\n const overall = toNumber(row['overall'] ?? row['reputation_score'] ?? row['rep_overall']);\n const tier = String(row['tier'] ?? row['reputation_tier'] ?? row['rep_tier'] ?? 'unrated');\n\n return {\n overall,\n reliability: toNumber(row['reliability'] ?? row['rep_reliability']),\n speed: toNumber(row['speed'] ?? row['rep_speed']),\n volume: toNumber(row['volume'] ?? row['rep_volume']),\n consistency: toNumber(row['consistency'] ?? row['rep_consistency']),\n policyCompliance: toNumber(row['policy_compliance'] ?? row['rep_policy_compliance']),\n reviewAverage: toNumber(row['review_average'] ?? row['reviewAverage'] ?? row['rep_review_average']),\n reviewCount: toNumber(row['review_count'] ?? row['reviewCount'] ?? row['rep_review_count']),\n tier: tier as ReputationScore['tier'],\n };\n}\n\nexport function mapReviewRow(row: Record<string, unknown>, explorerBase: string): Review {\n const reviewId = String(row['review_id'] ?? row['reviewId'] ?? '');\n const txHash = String(row['tx_hash'] ?? row['txHash'] ?? '');\n\n const categories: Record<string, number> = {};\n const quality = toNumber(row['quality_rating']);\n const communication = toNumber(row['communication_rating']);\n const speed = toNumber(row['speed_rating']);\n const value = toNumber(row['value_rating']);\n if (quality) categories['quality'] = quality;\n if (communication) categories['communication'] = communication;\n if (speed) categories['speed'] = speed;\n if (value) categories['value'] = value;\n\n const reviewer = (() => {\n const actor: ActorReference = {\n type: normalizeActorType(row['reviewer_actor_type']),\n address: String(row['reviewer_address'] ?? ''),\n };\n if (row['reviewer_identity']) actor.identityId = String(row['reviewer_identity']);\n return actor;\n })();\n\n const target = (() => {\n const actor: ActorReference = {\n type: normalizeActorType(row['target_actor_type']),\n address: String(row['target_address'] ?? ''),\n };\n if (row['target_identity']) actor.identityId = String(row['target_identity']);\n return actor;\n })();\n\n const review: Review = {\n reviewId,\n reviewer,\n target,\n escrowId: String(row['escrow_id'] ?? ''),\n rating: toNumber(row['rating']),\n timestamp: toTimestamp(row['timestamp']),\n txHash,\n verified: Boolean(row['verified']),\n explorerUrl: txHash ? `${explorerBase}/tx/${txHash}` : '',\n };\n\n if (row['comment']) review.comment = String(row['comment']);\n if (Object.keys(categories).length > 0) review.categories = categories;\n\n return review;\n}\n\nexport function mapReviewSummary(avg: number, count: number): ReviewSummary {\n return {\n average: avg,\n count,\n distribution: { '1': 0, '2': 0, '3': 0, '4': 0, '5': 0 },\n recentReviews: [],\n };\n}\n\nexport function mapListingRow(row: Record<string, unknown>, explorerBase: string): Listing {\n const identityRow: Record<string, unknown> = {\n identity_id: row['identity_id'] ?? row['identity_identity_id'],\n actor_type: row['identity_actor_type'],\n address: row['identity_address'],\n owner: row['identity_owner'],\n label: row['identity_label'],\n capabilities: row['identity_capabilities'],\n status: row['identity_status'],\n attestation_count: row['identity_attestation_count'],\n created_at: row['identity_created_at'],\n tx_hash: row['identity_tx_hash'],\n };\n\n const reputation = mapReputationScoreRow(row);\n const reviewAverage = toNumber(row['review_average'] ?? row['rep_review_average'] ?? row['reviewAverage']);\n const reviewCount = toNumber(row['review_count'] ?? row['rep_review_count'] ?? row['reviewCount']);\n\n const listingId = String(row['listing_id'] ?? row['listingId'] ?? '');\n const txHash = String(row['tx_hash'] ?? row['txHash'] ?? '');\n\n return {\n listingId,\n identity: mapIdentityRow(identityRow, explorerBase),\n name: String(row['name'] ?? ''),\n description: String(row['description'] ?? ''),\n category: row['category'] as Listing['category'],\n pricing: {\n type: String(row['pricing_type'] ?? row['pricingType'] ?? 'fixed') as Listing['pricing']['type'],\n amount: String(row['price_amount'] ?? row['priceAmount'] ?? '0'),\n currency: 'USDC',\n },\n capabilities: normalizeStringArray(row['capabilities']),\n reputation,\n reviewSummary: mapReviewSummary(reviewAverage, reviewCount),\n active: Boolean(row['active']),\n createdAt: toTimestamp(row['created_at'] ?? row['createdAt']),\n txHash,\n explorerUrl: listingId ? `${explorerBase}/listing/${listingId}` : '',\n };\n}\n","import type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport {\n actorTypeToEnum,\n enumToActorType,\n identityStatusFromEnum,\n toBytes32,\n fromBytes32,\n waitForReceipt,\n mapContractError,\n} from '../../utils/contract-helpers.js';\nimport { IndexerClient } from '../../utils/indexer-client.js';\nimport { mapIdentityRow } from '../../utils/indexer-mappers.js';\nimport type {\n RegisterIdentityOptions,\n Identity,\n Attestation,\n PauseResult,\n TxReceipt,\n IdentityListFilters,\n AttestationInput,\n UpdateIdentityOptions,\n OnChainIdentity,\n OnChainAttestation,\n} from './types.js';\n\n/** Zero bytes32 constant */\nconst ZERO_BYTES32 = '0x0000000000000000000000000000000000000000000000000000000000000000' as const;\n\n/**\n * Manages identity registration, resolution, and lifecycle.\n *\n * Everything in Invariance is an Identity. An identity is an on-chain entity\n * that can perform actions, hold reputation, and be verified. The identity\n * module replaces the concept of \"wallet management\" with a universal actor registry.\n *\n * @example\n * ```typescript\n * const agent = await inv.identity.register({\n * type: 'agent',\n * owner: '0xDeveloperWallet',\n * label: 'AlphaTrader v2',\n * capabilities: ['swap', 'rebalance'],\n * wallet: { create: true },\n * });\n * ```\n */\nexport class IdentityManager {\n private readonly contracts: ContractFactory;\n private readonly events: InvarianceEventEmitter;\n private readonly telemetry: Telemetry;\n private indexer: IndexerClient | null = null;\n\n constructor(\n contracts: ContractFactory,\n events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ) {\n this.contracts = contracts;\n this.events = events;\n this.telemetry = telemetry;\n }\n\n /** Lazily initialize the indexer client */\n private getIndexer(): IndexerClient {\n if (!this.indexer) {\n this.indexer = new IndexerClient(this.contracts.getApiBaseUrl(), this.contracts.getApiKey());\n }\n return this.indexer;\n }\n\n /** Map an on-chain identity tuple to the SDK Identity type */\n private mapOnChainIdentity(raw: OnChainIdentity, txHash?: string): Identity {\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const identityIdStr = fromBytes32(raw.identityId);\n\n return {\n identityId: identityIdStr || raw.identityId,\n type: enumToActorType(raw.actorType),\n address: raw.addr,\n owner: raw.owner,\n label: raw.label,\n capabilities: [...raw.capabilities],\n status: identityStatusFromEnum(raw.status),\n attestations: 0,\n createdAt: Number(raw.createdAt),\n txHash: txHash ?? '',\n explorerUrl: `${explorerBase}/identity/${raw.identityId}`,\n };\n }\n\n /** Map an on-chain attestation tuple to the SDK Attestation type */\n private mapOnChainAttestation(raw: OnChainAttestation, txHash?: string): Attestation {\n const evidence = raw.evidenceHash === ZERO_BYTES32 ? undefined : raw.evidenceHash;\n const expiresAt = raw.expiresAt > 0n ? Number(raw.expiresAt) : undefined;\n\n const result: Attestation = {\n attestationId: raw.attestationId,\n identity: raw.identityId,\n attester: raw.attester,\n claim: raw.claim,\n txHash: txHash ?? '',\n verified: !raw.revoked,\n };\n if (evidence !== undefined) {\n result.evidence = evidence;\n }\n if (expiresAt !== undefined) {\n result.expiresAt = expiresAt;\n }\n return result;\n }\n\n /**\n * Register a new identity (agent, human, device, or service).\n *\n * Creates an on-chain identity record and optionally provisions\n * an embedded wallet via Privy.\n *\n * @param opts - Registration options including type, owner, and label\n * @returns The newly created identity\n */\n async register(opts: RegisterIdentityOptions): Promise<Identity> {\n const validTypes = ['agent', 'human', 'device', 'service'];\n if (!validTypes.includes(opts.type)) {\n throw new InvarianceError(ErrorCode.NETWORK_ERROR, `Invalid identity type: ${opts.type}. Must be one of: ${validTypes.join(', ')}`);\n }\n\n this.telemetry.track('identity.register', { type: opts.type });\n\n try {\n const contract = this.contracts.getContract('identity');\n const publicClient = this.contracts.getPublicClient();\n\n const addr = (opts.address ?? opts.owner) as `0x${string}`;\n const actorType = actorTypeToEnum(opts.type);\n const capabilities = opts.capabilities ?? [];\n\n const writeFn = contract.write['register'];\n if (!writeFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'register function not found on contract');\n const txHash = await writeFn([addr, actorType, opts.label, capabilities]);\n\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Read back the full identity from chain\n const resolveFn = contract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found on contract');\n const identityId = await resolveFn([addr]) as `0x${string}`;\n\n const getFn = contract.read['get'];\n if (!getFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'get function not found on contract');\n const raw = await getFn([identityId]) as OnChainIdentity;\n\n const identity = this.mapOnChainIdentity(raw, receipt.txHash);\n\n this.events.emit('identity.registered', {\n identityId: identity.identityId,\n address: identity.address,\n });\n\n return identity;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Get identity details by address.\n *\n * @param address - The 0x wallet address of the identity\n * @returns The identity record\n * @throws {InvarianceError} If identity is not found\n */\n async get(address: string): Promise<Identity> {\n this.telemetry.track('identity.get');\n\n try {\n const contract = this.contracts.getContract('identity');\n\n const resolveFn = contract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found on contract');\n const identityId = await resolveFn([address as `0x${string}`]) as `0x${string}`;\n\n if (identityId === ZERO_BYTES32) {\n throw new InvarianceError(\n ErrorCode.IDENTITY_NOT_FOUND,\n `Identity not found for address: ${address}`,\n );\n }\n\n const getFn = contract.read['get'];\n if (!getFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'get function not found on contract');\n const raw = await getFn([identityId]) as OnChainIdentity;\n return this.mapOnChainIdentity(raw);\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Resolve an identity by ID, address, or ENS name.\n *\n * @param idOrAddress - Identity ID (bytes32 hex), 0x address, or string ID\n * @returns The resolved identity\n * @throws {InvarianceError} If identity cannot be resolved\n */\n async resolve(idOrAddress: string): Promise<Identity> {\n this.telemetry.track('identity.resolve');\n\n try {\n const contract = this.contracts.getContract('identity');\n\n let identityId: `0x${string}`;\n\n // If it's a 42-char hex address, resolve to identityId first\n if (idOrAddress.startsWith('0x') && idOrAddress.length === 42) {\n const resolveFn = contract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found on contract');\n identityId = await resolveFn([idOrAddress as `0x${string}`]) as `0x${string}`;\n if (identityId === ZERO_BYTES32) {\n throw new InvarianceError(\n ErrorCode.IDENTITY_NOT_FOUND,\n `Cannot resolve identity: ${idOrAddress}`,\n );\n }\n } else {\n // Treat as identityId (either bytes32 hex or string to encode)\n identityId = toBytes32(idOrAddress);\n }\n\n const getFn = contract.read['get'];\n if (!getFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'get function not found on contract');\n const raw = await getFn([identityId]) as OnChainIdentity;\n return this.mapOnChainIdentity(raw);\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Update identity metadata.\n *\n * @param id - The identity ID to update\n * @param opts - Fields to update (label, metadata, capabilities)\n * @returns The updated identity\n */\n async update(id: string, opts: UpdateIdentityOptions): Promise<Identity> {\n this.telemetry.track('identity.update');\n\n try {\n const contract = this.contracts.getContract('identity');\n const publicClient = this.contracts.getPublicClient();\n const identityId = toBytes32(id);\n\n const updateFn = contract.write['update'];\n if (!updateFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'update function not found on contract');\n const txHash = await updateFn([identityId, opts.label ?? '', opts.capabilities ?? []]);\n\n await waitForReceipt(publicClient, txHash);\n\n // Re-fetch updated identity\n const getFn = contract.read['get'];\n if (!getFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'get function not found on contract');\n const raw = await getFn([identityId]) as OnChainIdentity;\n return this.mapOnChainIdentity(raw, txHash);\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * EMERGENCY STOP: Freeze an identity.\n *\n * Pausing an identity is the kill switch. One call revokes all active\n * policies, freezes all escrowed funds, and cancels all pending intents.\n * Only the identity owner can call this.\n *\n * @param id - The identity ID to pause\n * @returns Pause result with counts of affected resources\n */\n async pause(id: string): Promise<PauseResult> {\n this.telemetry.track('identity.pause');\n\n try {\n const contract = this.contracts.getContract('identity');\n const publicClient = this.contracts.getPublicClient();\n const identityId = toBytes32(id);\n\n const pauseFn = contract.write['pauseIdentity'];\n if (!pauseFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'pauseIdentity function not found on contract');\n const txHash = await pauseFn([identityId]);\n await waitForReceipt(publicClient, txHash);\n\n // Emit event AFTER successful tx (fixes PR #5 emit-before-throw bug)\n this.events.emit('identity.paused', { identityId: id });\n\n return {\n identityId: id,\n status: 'suspended',\n policiesRevoked: 0,\n escrowsFrozen: 0,\n pendingIntentsCancelled: 0,\n txHash,\n resumable: true,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Resume a paused identity.\n *\n * Reactivates the identity. Policies must be re-attached manually\n * as a safety measure. Escrows unfreeze but require fresh approval.\n *\n * @param id - The identity ID to resume\n * @returns Transaction receipt\n */\n async resume(id: string): Promise<TxReceipt> {\n this.telemetry.track('identity.resume');\n\n try {\n const contract = this.contracts.getContract('identity');\n const publicClient = this.contracts.getPublicClient();\n const identityId = toBytes32(id);\n\n const resumeFn = contract.write['resume'];\n if (!resumeFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resume function not found on contract');\n const txHash = await resumeFn([identityId]);\n const receipt = await waitForReceipt(publicClient, txHash);\n\n this.events.emit('identity.resumed', { identityId: id });\n\n return {\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n status: receipt.status,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Permanently deactivate an identity.\n *\n * This is irreversible. All policies are revoked and escrows are refunded.\n *\n * @param id - The identity ID to deactivate\n * @returns Transaction receipt\n */\n async deactivate(id: string): Promise<TxReceipt> {\n this.telemetry.track('identity.deactivate');\n\n try {\n const contract = this.contracts.getContract('identity');\n const publicClient = this.contracts.getPublicClient();\n const identityId = toBytes32(id);\n\n const deactivateFn = contract.write['deactivate'];\n if (!deactivateFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'deactivate function not found on contract');\n const txHash = await deactivateFn([identityId]);\n const receipt = await waitForReceipt(publicClient, txHash);\n\n return {\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n status: receipt.status,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * List identities by type, owner, or status.\n *\n * Attempts the indexer API first, falls back to on-chain reads.\n *\n * @param filters - Optional filters to narrow results\n * @returns Array of matching identities\n */\n async list(filters?: IdentityListFilters): Promise<Identity[]> {\n this.telemetry.track('identity.list', { hasFilters: filters !== undefined });\n\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (available) {\n try {\n const pageSize = Math.max(1, filters?.limit ?? 20);\n const offset = Math.max(0, filters?.offset ?? 0);\n const page = Math.floor(offset / pageSize) + 1;\n const params: Record<string, string | number | undefined> = {\n actorType: filters?.type,\n status: filters?.status,\n owner: filters?.owner,\n page,\n pageSize,\n };\n const rows = await indexer.get<Record<string, unknown>[]>('/identities', params);\n const explorerBase = this.contracts.getExplorerBaseUrl();\n return rows.map((row) => mapIdentityRow(row, explorerBase));\n } catch {\n // Fall through to on-chain fallback\n }\n }\n\n // On-chain fallback: indexer unavailable, return empty\n return [];\n }\n\n /**\n * Add an attestation to an identity.\n *\n * Attestations are claims made by third parties about an identity,\n * stored on-chain with optional evidence hashes.\n *\n * @param id - The identity ID to attest\n * @param attestation - The attestation details\n * @returns The created attestation record\n */\n async attest(id: string, attestation: AttestationInput): Promise<Attestation> {\n this.telemetry.track('identity.attest', { claim: attestation.claim });\n\n try {\n const contract = this.contracts.getContract('identity');\n const publicClient = this.contracts.getPublicClient();\n const identityId = toBytes32(id);\n\n const evidenceHash = attestation.evidence\n ? toBytes32(attestation.evidence)\n : ZERO_BYTES32;\n const expiresAt = BigInt(attestation.expiresAt ?? 0);\n\n const attestFn = contract.write['attest'];\n if (!attestFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'attest function not found on contract');\n const txHash = await attestFn([identityId, attestation.claim, evidenceHash, expiresAt]);\n\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Read back attestations to get the created one\n const getAttestationsFn = contract.read['getAttestations'];\n if (!getAttestationsFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getAttestations function not found on contract');\n const attestations = await getAttestationsFn([identityId]) as OnChainAttestation[];\n // The last attestation should be the one we just created\n const created = attestations[attestations.length - 1];\n if (created) {\n return this.mapOnChainAttestation(created, receipt.txHash);\n }\n\n // Fallback if we can't find it\n const result: Attestation = {\n attestationId: receipt.txHash,\n identity: id,\n attester: attestation.attester,\n claim: attestation.claim,\n txHash: receipt.txHash,\n verified: true,\n };\n if (attestation.evidence !== undefined) {\n result.evidence = attestation.evidence;\n }\n if (attestation.expiresAt !== undefined) {\n result.expiresAt = attestation.expiresAt;\n }\n return result;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Get all attestations for an identity.\n *\n * @param id - The identity ID\n * @returns Array of attestation records\n */\n async attestations(id: string): Promise<Attestation[]> {\n this.telemetry.track('identity.attestations');\n\n try {\n const contract = this.contracts.getContract('identity');\n const identityId = toBytes32(id);\n\n const getAttestationsFn = contract.read['getAttestations'];\n if (!getAttestationsFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getAttestations function not found on contract');\n const raw = await getAttestationsFn([identityId]) as OnChainAttestation[];\n return raw.map((a) => this.mapOnChainAttestation(a));\n } catch (err) {\n throw mapContractError(err);\n }\n }\n}\n","import {\n createWalletClient,\n createPublicClient,\n http,\n custom,\n formatEther,\n parseEther,\n getAddress,\n type WalletClient,\n type PublicClient,\n type Account,\n type Chain,\n} from 'viem';\nimport type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport type { EIP1193Provider, InvarianceSigner, InvarianceConfig } from '@invariance/common';\nimport { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport type { WalletInfo, BalanceInfo, WalletProvider, FundOptions, CreateWalletOptions } from './types.js';\nimport type { TxReceipt } from '@invariance/common';\nimport { waitForReceipt } from '../../utils/contract-helpers.js';\nimport { toUSDCWei, fromUSDCWei } from '../../utils/usdc.js';\n\n/**\n * Handles wallet management for all identity types.\n *\n * Accepts any wallet type: viem Account, WalletClient, EIP-1193 provider,\n * or custom InvarianceSigner. Normalizes to viem WalletClient internally.\n *\n * @example\n * ```typescript\n * const inv = new Invariance({\n * chain: 'base',\n * signer: privateKeyToAccount('0x...'),\n * });\n * const balance = await inv.wallet.balance();\n * ```\n */\nexport class WalletManager {\n private readonly contracts: ContractFactory;\n private readonly telemetry: Telemetry;\n private readonly config: InvarianceConfig;\n private walletClient: WalletClient | null = null;\n private publicClient: PublicClient | null = null;\n private address: `0x${string}` | null = null;\n private detectedProvider: WalletProvider = 'raw';\n\n constructor(\n contracts: ContractFactory,\n telemetry: Telemetry,\n config: InvarianceConfig,\n ) {\n this.contracts = contracts;\n this.telemetry = telemetry;\n this.config = config;\n }\n\n /**\n * Initialize from a signer provided in config.\n * Detects type and normalizes to viem WalletClient.\n */\n async initFromSigner(signer: unknown, rpcUrl: string, chain: Chain): Promise<void> {\n if (this.isViemAccount(signer)) {\n this.detectedProvider = 'raw';\n const account = signer as Account;\n this.walletClient = createWalletClient({ account, chain, transport: http(rpcUrl) });\n this.address = account.address;\n } else if (this.isWalletClient(signer)) {\n this.detectedProvider = 'custom';\n this.walletClient = signer as WalletClient;\n const addresses = await this.walletClient.getAddresses();\n const firstAddr = addresses[0];\n if (!firstAddr) {\n throw new InvarianceError(ErrorCode.WALLET_NOT_CONNECTED, 'WalletClient has no addresses');\n }\n this.address = firstAddr;\n } else if (this.isPrivyWallet(signer)) {\n // Check for Privy BEFORE generic EIP-1193 provider\n this.detectedProvider = 'privy';\n const provider = signer as EIP1193Provider;\n const accounts = await provider.request({ method: 'eth_requestAccounts' }) as string[];\n const firstAccount = accounts[0];\n if (!firstAccount) {\n throw new InvarianceError(ErrorCode.WALLET_NOT_CONNECTED, 'No accounts from Privy');\n }\n this.address = firstAccount as `0x${string}`;\n this.walletClient = createWalletClient({\n account: this.address,\n chain,\n transport: custom(provider),\n });\n } else if (this.isEIP1193Provider(signer)) {\n this.detectedProvider = 'metamask';\n const provider = signer as EIP1193Provider;\n const accounts = await provider.request({ method: 'eth_requestAccounts' }) as string[];\n const firstAccount = accounts[0];\n if (!firstAccount) {\n throw new InvarianceError(ErrorCode.WALLET_NOT_CONNECTED, 'No accounts returned from provider');\n }\n this.address = firstAccount as `0x${string}`;\n this.walletClient = createWalletClient({\n account: this.address,\n chain,\n transport: custom(provider),\n });\n } else if (this.isInvarianceSigner(signer)) {\n this.detectedProvider = 'custom';\n const invSigner = signer as InvarianceSigner;\n const addr = await invSigner.getAddress();\n this.address = addr as `0x${string}`;\n this.walletClient = createWalletClient({\n account: this.address,\n chain,\n transport: http(rpcUrl),\n });\n } else {\n throw new InvarianceError(\n ErrorCode.WALLET_NOT_CONNECTED,\n 'Unrecognized signer type. Provide a viem Account, WalletClient, EIP-1193 provider, or InvarianceSigner.',\n );\n }\n\n this.publicClient = createPublicClient({ chain, transport: http(rpcUrl) });\n }\n\n // =========================================================================\n // Type Guards\n // =========================================================================\n\n private isViemAccount(signer: unknown): boolean {\n return (\n typeof signer === 'object' &&\n signer !== null &&\n 'address' in signer &&\n 'signMessage' in signer &&\n 'type' in signer\n );\n }\n\n private isWalletClient(signer: unknown): boolean {\n return (\n typeof signer === 'object' &&\n signer !== null &&\n 'transport' in signer &&\n 'getAddresses' in signer &&\n typeof (signer as Record<string, unknown>)['getAddresses'] === 'function'\n );\n }\n\n private isEIP1193Provider(signer: unknown): boolean {\n return (\n typeof signer === 'object' &&\n signer !== null &&\n 'request' in signer &&\n typeof (signer as Record<string, unknown>)['request'] === 'function' &&\n !('transport' in signer)\n );\n }\n\n private isInvarianceSigner(signer: unknown): boolean {\n return (\n typeof signer === 'object' &&\n signer !== null &&\n 'getAddress' in signer &&\n 'signMessage' in signer &&\n 'signTypedData' in signer &&\n typeof (signer as Record<string, unknown>)['getAddress'] === 'function'\n );\n }\n\n private isPrivyWallet(signer: unknown): boolean {\n if (typeof signer !== 'object' || signer === null) return false;\n const obj = signer as Record<string, unknown>;\n\n // Check for Privy-specific markers\n // Common patterns: provider._privy, provider.isPrivy, provider.privy\n return (\n '_privy' in obj ||\n 'isPrivy' in obj ||\n ('privy' in obj && obj['privy'] !== undefined) ||\n (obj.constructor?.name === 'PrivyProvider')\n );\n }\n\n // =========================================================================\n // Internal Helpers\n // =========================================================================\n\n private requireWallet(): void {\n if (!this.walletClient || !this.address) {\n throw new InvarianceError(ErrorCode.WALLET_NOT_CONNECTED, 'No wallet connected. Provide a signer in config.');\n }\n }\n\n private requirePublicClient(): PublicClient {\n if (!this.publicClient) {\n throw new InvarianceError(ErrorCode.WALLET_NOT_CONNECTED, 'Public client not initialized.');\n }\n return this.publicClient;\n }\n\n // =========================================================================\n // Accessors\n // =========================================================================\n\n /** Get the wallet address */\n getAddress(): `0x${string}` {\n this.requireWallet();\n return this.address!;\n }\n\n /** Get the underlying viem WalletClient */\n getWalletClient(): WalletClient {\n this.requireWallet();\n return this.walletClient!;\n }\n\n /** Get the public client for read operations */\n getPublicClient(): PublicClient {\n return this.requirePublicClient();\n }\n\n /** Check if a wallet is connected */\n isConnected(): boolean {\n return this.walletClient !== null && this.address !== null;\n }\n\n // =========================================================================\n // Public API (backwards compatible)\n // =========================================================================\n\n /**\n * Create an embedded wallet using Privy.\n * Requires Privy configuration in InvarianceConfig: { privy: { appId, appSecret } }\n * @param _opts - Optional wallet creation options\n */\n async create(_opts?: CreateWalletOptions): Promise<WalletInfo> {\n this.telemetry.track('wallet.create');\n\n // Check if Privy is configured\n const privyConfig = this.config.privy;\n if (!privyConfig) {\n throw new InvarianceError(\n ErrorCode.WALLET_NOT_CONNECTED,\n 'Embedded wallet creation requires Privy config: { privy: { appId, appSecret } }',\n );\n }\n\n // Lazy-import Privy SDK (optional dependency)\n let PrivyClient: unknown; // Dynamic import of optional peer dep; type unknown at compile time\n try {\n const privyModule = await import('@privy-io/server-auth');\n PrivyClient = (privyModule as Record<string, unknown>)['PrivyClient'];\n } catch {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n 'Missing dependency: @privy-io/server-auth is required for embedded wallet creation. Install with: pnpm add @privy-io/server-auth',\n );\n }\n\n // Create Privy client and embedded wallet\n const privy = new (PrivyClient as new (appId: string, appSecret: string) => { walletApi: { create(opts: { chainType: string }): Promise<{ address: string; id: string }> } })(privyConfig.appId, privyConfig.appSecret);\n\n // Create a new embedded wallet using Privy's Wallet API\n const wallet = await privy.walletApi.create({\n chainType: _opts?.chainType ?? 'ethereum',\n });\n\n return {\n address: wallet.address as string,\n provider: 'privy',\n chainId: this.contracts.getChainId(),\n connected: true,\n isSmartAccount: false,\n };\n }\n\n /** Get the current wallet info */\n async get(): Promise<WalletInfo> {\n this.telemetry.track('wallet.get');\n this.requireWallet();\n return {\n address: this.address!,\n provider: this.detectedProvider,\n chainId: this.contracts.getChainId(),\n connected: true,\n isSmartAccount: false,\n };\n }\n\n /**\n * Send USDC or ETH to a wallet address.\n * WARNING: This method executes transfers immediately without confirmation prompts.\n * The caller is responsible for implementing any necessary security checks.\n * @param address - The recipient address\n * @param opts - Fund options including amount and token type (defaults to USDC)\n */\n async fund(address: string, opts: FundOptions): Promise<TxReceipt> {\n this.telemetry.track('wallet.fund', { token: opts.token ?? 'USDC' });\n this.requireWallet();\n\n // Input validation\n const parsedAmount = parseFloat(opts.amount);\n if (isNaN(parsedAmount) || parsedAmount <= 0) {\n throw new InvarianceError(ErrorCode.INVALID_INPUT, `Invalid fund amount: ${opts.amount}. Must be a positive number.`);\n }\n if (!address) {\n throw new InvarianceError(ErrorCode.INVALID_INPUT, `Invalid recipient address: ${address}`);\n }\n try {\n getAddress(address); // EIP-55 checksum validation\n } catch {\n throw new InvarianceError(ErrorCode.INVALID_INPUT, `Invalid recipient address (failed EIP-55 checksum): ${address}`);\n }\n\n const token = opts.token ?? 'USDC';\n const recipient = address as `0x${string}`;\n const publicClient = this.requirePublicClient();\n\n if (token === 'USDC') {\n // USDC transfer (ERC20)\n const usdcContract = this.contracts.getContract('mockUsdc');\n const amount = toUSDCWei(opts.amount);\n\n const transferFn = usdcContract.write['transfer'];\n if (!transferFn) {\n throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'USDC contract transfer not found');\n }\n\n const txHash = await transferFn([recipient, amount]);\n const receipt = await waitForReceipt(publicClient, txHash);\n\n return {\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n status: receipt.status,\n };\n } else {\n // ETH transfer (native)\n const value = parseEther(opts.amount);\n\n const walletClient = this.walletClient!;\n const account = walletClient.account ?? this.address;\n if (!account) {\n throw new InvarianceError(ErrorCode.WALLET_NOT_CONNECTED, 'No account available on wallet client.');\n }\n const txHash = await walletClient.sendTransaction({\n account,\n to: recipient,\n value,\n chain: walletClient.chain,\n });\n const receipt = await waitForReceipt(publicClient, txHash);\n\n return {\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n status: receipt.status,\n };\n }\n }\n\n /**\n * Get USDC and ETH balances for an address.\n * @param address - The address to check (defaults to current wallet)\n */\n async balance(address?: string | undefined): Promise<BalanceInfo> {\n this.telemetry.track('wallet.balance');\n const pc = this.requirePublicClient();\n if (!address && !this.address) {\n throw new InvarianceError(ErrorCode.WALLET_NOT_CONNECTED, 'No wallet connected. Provide an address or connect a wallet first.');\n }\n const addr = (address ?? this.address) as `0x${string}`;\n\n // Get ETH balance\n const ethBalance = await pc.getBalance({ address: addr });\n\n // Get USDC balance (null signals contract unreachable)\n let usdcBalance: string | null = '0.000000';\n try {\n const usdcContract = this.contracts.getContract('mockUsdc');\n const balanceOfFn = usdcContract.read['balanceOf'];\n if (balanceOfFn) {\n const balance = await balanceOfFn([addr]) as bigint;\n usdcBalance = fromUSDCWei(balance);\n }\n } catch (err) {\n this.telemetry.track('wallet.balance.error', { error: String(err) });\n usdcBalance = null;\n }\n\n return {\n usdc: usdcBalance ?? '0.000000',\n eth: formatEther(ethBalance),\n address: addr,\n };\n }\n\n}\n","import { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../errors/InvarianceError.js';\n\n/** USDC decimals (6) */\nconst USDC_DECIMALS = 6;\n\n/**\n * Convert decimal USDC amount to USDC wei (6 decimals).\n *\n * @param amount - Decimal amount string (e.g., \"100.50\")\n * @returns The amount in USDC wei (6 decimals)\n * @throws {InvarianceError} If amount is not a valid positive decimal string\n */\nexport function toUSDCWei(amount: string): bigint {\n if (!amount || !/^\\d+(\\.\\d+)?$/.test(amount)) {\n throw new InvarianceError(ErrorCode.INVALID_INPUT, `Invalid USDC amount: ${amount}`);\n }\n const parts = amount.split('.');\n const whole = parts[0] ?? '0';\n const rawFraction = parts[1] ?? '';\n if (rawFraction.length > USDC_DECIMALS) {\n throw new InvarianceError(ErrorCode.INVALID_INPUT, `USDC amount has too many decimal places (max ${USDC_DECIMALS}): ${amount}`);\n }\n const fraction = rawFraction.padEnd(USDC_DECIMALS, '0');\n return BigInt(whole + fraction);\n}\n\n/**\n * Convert USDC wei (6 decimals) to decimal string.\n *\n * @param wei - The amount in USDC wei (6 decimals)\n * @returns The amount in decimal format\n */\nexport function fromUSDCWei(wei: bigint): string {\n const str = wei.toString().padStart(USDC_DECIMALS + 1, '0');\n const whole = str.slice(0, -USDC_DECIMALS);\n const fraction = str.slice(-USDC_DECIMALS);\n return `${whole}.${fraction}`;\n}\n","/**\n * Low-level x402 payment client.\n *\n * Wraps `@x402/core` and `@x402/evm` to handle payment creation,\n * verification, and proof retrieval for the Invariance SDK.\n *\n * Requires optional peer dependencies: `@x402/core`, `@x402/evm`.\n * Install them with: `pnpm add @x402/core @x402/evm`\n */\nimport { ErrorCode } from '@invariance/common';\nimport { stringToHex } from 'viem';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport type { PaymentReceipt, PaymentVerification, X402Settings } from './types.js';\n\n/** USDC token metadata by chain ID (address + EIP-712 domain) */\nconst USDC_TOKENS: Record<number, { address: `0x${string}`; name: string; version: string }> = {\n 8453: {\n address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n name: 'USD Coin',\n version: '2',\n },\n 84532: {\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n name: 'USDC',\n version: '2',\n },\n};\n\n/** Default facilitator URL */\nconst DEFAULT_FACILITATOR_URL = 'https://x402.org/facilitator';\n\n// Lazy-loaded x402 modules (optional peer deps)\nlet _x402Core: typeof import('@x402/core/client') | null = null;\nlet _x402Evm: typeof import('@x402/evm/exact/client') | null = null;\n\nasync function loadX402Modules(): Promise<{\n x402Client: typeof import('@x402/core/client').x402Client;\n ExactEvmScheme: typeof import('@x402/evm/exact/client').ExactEvmScheme;\n}> {\n if (!_x402Core || !_x402Evm) {\n try {\n [_x402Core, _x402Evm] = await Promise.all([\n import('@x402/core/client'),\n import('@x402/evm/exact/client'),\n ]);\n } catch {\n throw new InvarianceError(\n ErrorCode.PAYMENT_FAILED,\n 'x402 payment modules not installed. Install them with: pnpm add @x402/core @x402/evm',\n );\n }\n }\n return { x402Client: _x402Core!.x402Client, ExactEvmScheme: _x402Evm!.ExactEvmScheme };\n}\n\ninterface ClientEvmSigner {\n address: string;\n signTypedData: (message: {\n domain: Record<string, unknown>;\n types: Record<string, unknown>;\n primaryType: string;\n message: Record<string, unknown>;\n }) => Promise<`0x${string}`>;\n}\n\ninterface X402ClientLike {\n createPaymentPayload: (paymentRequired: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Low-level client for x402 payment operations.\n *\n * Manages the x402Client instance and handles EVM-specific\n * payment creation and verification.\n */\nexport class X402PaymentClient {\n private client: X402ClientLike | null = null;\n private settings: X402Settings = {};\n private readonly chainId: number;\n\n constructor(chainId: number) {\n this.chainId = chainId;\n }\n\n /** Configure the client settings */\n configure(settings: X402Settings): void {\n this.settings = { ...this.settings, ...settings };\n // Reset client so it gets re-created with new settings\n this.client = null;\n }\n\n /** Get or create the x402Client with registered EVM scheme */\n private async getClient(signer: ClientEvmSigner): Promise<X402ClientLike> {\n if (!this.client) {\n const { x402Client, ExactEvmScheme } = await loadX402Modules();\n const network: `${string}:${string}` = `eip155:${this.chainId}`;\n this.client = new x402Client()\n .register(network, new ExactEvmScheme(signer as never)) as unknown as X402ClientLike;\n }\n return this.client;\n }\n\n /** Get the USDC token metadata for the current chain */\n private getUsdcToken(): { address: `0x${string}`; name: string; version: string } {\n const token = USDC_TOKENS[this.chainId];\n if (!token) {\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Unsupported chain for x402 payments: ${this.chainId}`,\n );\n }\n if (this.settings.usdcAddress) {\n return { ...token, address: this.settings.usdcAddress as `0x${string}` };\n }\n return token;\n }\n\n /** Get the USDC address for the current chain */\n getUsdcAddress(): `0x${string}` {\n return this.getUsdcToken().address;\n }\n\n /** Get the facilitator URL */\n getFacilitatorUrl(): string {\n return this.settings.facilitatorUrl ?? DEFAULT_FACILITATOR_URL;\n }\n\n /**\n * Create a payment for an action.\n *\n * @param signer - The EVM signer for the payer\n * @param amount - Payment amount in USDC (decimal string)\n * @param recipient - Recipient address\n * @param action - The action being paid for\n * @returns Payment receipt\n */\n async createPayment(\n signer: ClientEvmSigner,\n amount: string,\n recipient: string,\n action: string,\n ): Promise<PaymentReceipt> {\n try {\n const client = await this.getClient(signer);\n const usdcToken = this.getUsdcToken();\n\n // Convert amount to smallest unit (USDC has 6 decimals)\n const [whole = '0', frac = ''] = amount.split('.');\n const paddedFrac = (frac + '000000').slice(0, 6);\n const amountInUnits = (BigInt(whole) * 1_000_000n + BigInt(paddedFrac)).toString();\n\n // Create payment payload via x402 (v2 PaymentRequired shape)\n const network: `${string}:${string}` = `eip155:${this.chainId}`;\n const paymentRequired = {\n x402Version: 2 as const,\n resource: {\n url: action,\n description: `Payment for action: ${action}`,\n mimeType: 'application/json',\n },\n accepts: [{\n scheme: 'exact' as const,\n network,\n amount: amountInUnits,\n payTo: recipient,\n asset: usdcToken.address as string,\n maxTimeoutSeconds: 300,\n extra: {\n name: usdcToken.name,\n version: usdcToken.version,\n },\n }],\n };\n\n const payload = await client.createPaymentPayload(paymentRequired);\n\n // Generate a unique payment ID using crypto-safe randomness\n const { randomBytes } = await import('crypto');\n const paymentId = `x402_${Date.now().toString(36)}_${randomBytes(6).toString('hex')}`;\n\n const payloadHex = stringToHex(JSON.stringify(payload));\n const payloadHash = `0x${payloadHex.slice(2, 66)}`;\n return {\n paymentId,\n txHash: payloadHash,\n payloadHash,\n amount,\n recipient,\n payer: signer.address,\n action,\n timestamp: Date.now(),\n proof: JSON.stringify(payload),\n };\n } catch (err) {\n if (err instanceof InvarianceError) throw err;\n throw new InvarianceError(\n ErrorCode.PAYMENT_FAILED,\n `x402 payment creation failed: ${err instanceof Error ? err.message : 'unknown error'}`,\n );\n }\n }\n\n /**\n * Verify a payment receipt.\n *\n * @param receipt - The payment receipt to verify\n * @returns Verification result\n */\n async verifyPayment(receipt: PaymentReceipt): Promise<PaymentVerification> {\n try {\n // Verify the proof is parseable and contains valid payment data\n const payload = JSON.parse(receipt.proof);\n\n if (!payload) {\n return {\n valid: false,\n reason: 'Invalid payment proof: empty payload',\n };\n }\n\n // Verify amount matches\n const receiptAmount = parseFloat(receipt.amount);\n if (isNaN(receiptAmount) || receiptAmount <= 0) {\n return {\n valid: false,\n reason: `Invalid payment amount: ${receipt.amount}`,\n };\n }\n\n return {\n valid: true,\n receipt,\n };\n } catch (err) {\n return {\n valid: false,\n reason: `Payment verification failed: ${err instanceof Error ? err.message : 'unknown error'}`,\n };\n }\n }\n}\n","import type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport { IndexerClient } from '../../utils/indexer-client.js';\nimport { X402PaymentClient } from './X402Client.js';\nimport type {\n PayForActionOptions,\n PaymentReceipt,\n PaymentVerification,\n PaymentHistoryFilters,\n PaymentEstimate,\n X402Settings,\n} from './types.js';\n\n/**\n * Manages x402 payment protocol operations.\n *\n * Provides pay-per-action execution, payment verification, and\n * agent-to-agent payments using the x402 HTTP payment standard.\n * Payments are made in USDC on Base.\n *\n * @example\n * ```typescript\n * // Pay for an action\n * const receipt = await inv.x402.payForAction({\n * action: 'swap',\n * amount: '1.00',\n * recipient: '0xServiceProvider',\n * });\n *\n * // Verify a payment\n * const verification = await inv.x402.verifyPayment(receipt.paymentId);\n *\n * // Query payment history\n * const history = await inv.x402.history('agent-identity-id');\n * ```\n */\nexport class X402Manager {\n private readonly contracts: ContractFactory;\n private readonly events: InvarianceEventEmitter;\n private readonly telemetry: Telemetry;\n private paymentClient: X402PaymentClient | null = null;\n private indexer: IndexerClient | null = null;\n private receipts: Map<string, PaymentReceipt> = new Map();\n private static readonly MAX_RECEIPTS = 1000;\n\n constructor(\n contracts: ContractFactory,\n events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ) {\n this.contracts = contracts;\n this.events = events;\n this.telemetry = telemetry;\n }\n\n /** Lazily initialize the payment client */\n private getPaymentClient(): X402PaymentClient {\n if (!this.paymentClient) {\n const chainId = this.contracts.getChainId();\n this.paymentClient = new X402PaymentClient(chainId);\n }\n return this.paymentClient;\n }\n\n /** Lazily initialize the indexer client */\n private getIndexer(): IndexerClient {\n if (!this.indexer) {\n this.indexer = new IndexerClient(this.contracts.getApiBaseUrl(), this.contracts.getApiKey());\n }\n return this.indexer;\n }\n\n /**\n * Pay for an action via the x402 protocol.\n *\n * Creates a USDC payment authorization and returns a receipt\n * that can be attached to intent requests for policy verification.\n *\n * @param opts - Payment options including action, amount, and recipient\n * @returns Payment receipt with proof\n */\n async payForAction(opts: PayForActionOptions): Promise<PaymentReceipt> {\n this.telemetry.track('x402.payForAction', {\n action: opts.action,\n amount: opts.amount,\n });\n\n try {\n const client = this.getPaymentClient();\n\n // Get signer from wallet client\n const walletClient = this.contracts.getWalletClient();\n if (!walletClient) {\n throw new InvarianceError(\n ErrorCode.WALLET_NOT_CONNECTED,\n 'Wallet not connected. A signer is required for x402 payments.',\n );\n }\n\n const account = walletClient.account;\n if (!account) {\n throw new InvarianceError(\n ErrorCode.WALLET_NOT_CONNECTED,\n 'Wallet account not available. A signer is required for x402 payments.',\n );\n }\n\n const signer = {\n address: account.address,\n signTypedData: async (message: {\n domain: Record<string, unknown>;\n types: Record<string, unknown>;\n primaryType: string;\n message: Record<string, unknown>;\n }) => {\n return walletClient.signTypedData({\n account,\n domain: message.domain as Record<string, unknown>,\n types: message.types as Record<string, readonly { name: string; type: string }[]>,\n primaryType: message.primaryType,\n message: message.message,\n }) as Promise<`0x${string}`>;\n },\n };\n\n const receipt = await client.createPayment(\n signer,\n opts.amount,\n opts.recipient,\n opts.action,\n );\n\n // Cache the receipt for later verification\n if (this.receipts.size >= X402Manager.MAX_RECEIPTS) {\n const oldest = this.receipts.keys().next().value;\n if (oldest !== undefined) this.receipts.delete(oldest);\n }\n this.receipts.set(receipt.paymentId, receipt);\n\n this.events.emit('payment.completed', {\n paymentId: receipt.paymentId,\n action: opts.action,\n amount: opts.amount,\n });\n\n return receipt;\n } catch (err) {\n const reason = err instanceof Error ? err.message : 'unknown error';\n\n this.events.emit('payment.failed', {\n action: opts.action,\n reason,\n });\n\n if (err instanceof InvarianceError) throw err;\n\n throw new InvarianceError(\n ErrorCode.PAYMENT_FAILED,\n `Payment for action \"${opts.action}\" failed: ${reason}`,\n );\n }\n }\n\n /**\n * Verify a payment by receipt ID.\n *\n * Checks that the payment proof is valid and the amount\n * meets requirements.\n *\n * @param receiptId - The payment receipt ID to verify\n * @returns Verification result\n */\n async verifyPayment(receiptId: string): Promise<PaymentVerification> {\n this.telemetry.track('x402.verifyPayment');\n\n // Check local cache first\n const cached = this.receipts.get(receiptId);\n if (cached) {\n const client = this.getPaymentClient();\n return client.verifyPayment(cached);\n }\n\n // Try indexer\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n if (available) {\n try {\n const receipt = await indexer.get<PaymentReceipt>(`/payments/${receiptId}`);\n const client = this.getPaymentClient();\n return client.verifyPayment(receipt);\n } catch {\n // Fall through\n }\n }\n\n return {\n valid: false,\n reason: `Payment receipt not found: ${receiptId}`,\n };\n }\n\n /**\n * Query payment history for an identity.\n *\n * @param identityId - The identity to query payments for\n * @param filters - Optional filters for action, time range, pagination\n * @returns Array of payment receipts\n */\n async history(identityId: string, filters?: PaymentHistoryFilters): Promise<PaymentReceipt[]> {\n this.telemetry.track('x402.history', { hasFilters: filters !== undefined });\n\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (available) {\n try {\n const params: Record<string, string | number | undefined> = {\n identityId,\n action: filters?.action,\n from: filters?.from !== undefined ? String(filters.from) : undefined,\n to: filters?.to !== undefined ? String(filters.to) : undefined,\n limit: filters?.limit,\n offset: filters?.offset,\n };\n return await indexer.get<PaymentReceipt[]>('/payments', params);\n } catch {\n // Fall through to local cache\n }\n }\n\n // Fallback: return matching receipts from local cache\n const results: PaymentReceipt[] = [];\n for (const receipt of this.receipts.values()) {\n if (filters?.action && receipt.action !== filters.action) continue;\n results.push(receipt);\n }\n return results;\n }\n\n /**\n * Estimate the cost for an action.\n *\n * @param opts - Estimation options\n * @returns Cost estimate\n */\n async estimateCost(opts: { action: string; recipient?: string }): Promise<PaymentEstimate> {\n this.telemetry.track('x402.estimateCost', { action: opts.action });\n\n // Query indexer for pricing if available\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (available) {\n try {\n const params: Record<string, string | number | undefined> = {\n action: opts.action,\n recipient: opts.recipient,\n };\n return await indexer.get<PaymentEstimate>('/payments/estimate', params);\n } catch {\n // Fall through to default estimate\n }\n }\n\n // Default estimate\n return {\n amount: '0.01',\n action: opts.action,\n required: false,\n };\n }\n\n /**\n * Configure x402 module settings.\n *\n * @param settings - Configuration options\n */\n async configure(settings: X402Settings): Promise<void> {\n this.telemetry.track('x402.configure');\n const client = this.getPaymentClient();\n client.configure(settings);\n }\n}\n","import type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport { IndexerClient } from '../../utils/indexer-client.js';\nimport { mapIntentRow } from '../../utils/indexer-mappers.js';\nimport { X402Manager } from '../x402/X402Manager.js';\nimport { stringToHex } from 'viem';\nimport { parseBaseUnitAmount } from '../../utils/amounts.js';\nimport {\n toBytes32,\n fromBytes32,\n waitForReceipt,\n mapContractError,\n parseIntentIdFromLogs,\n hashMetadata,\n intentStatusFromEnum,\n generateActorSignature,\n generatePlatformCommitment,\n} from '../../utils/contract-helpers.js';\nimport type {\n IntentRequestOptions,\n IntentResult,\n PreparedIntent,\n IntentStatus,\n ApprovalResult,\n TxReceipt,\n IntentHistoryFilters,\n RetryConfig,\n RetryResult,\n} from './types.js';\n\n/** On-chain Intent struct */\ninterface OnChainIntent {\n intentId: `0x${string}`;\n requesterIdentityId: `0x${string}`;\n requester: string;\n action: `0x${string}`;\n target: string;\n value: bigint;\n data: string;\n description: string;\n metadataHash: `0x${string}`;\n status: number;\n createdAt: bigint;\n expiresAt: bigint;\n completedAt: bigint;\n resultHash: `0x${string}`;\n}\n\n/** On-chain Approval struct */\ninterface OnChainApproval {\n approver: string;\n approverIdentityId: `0x${string}`;\n approvedAt: bigint;\n reason: string;\n}\n\n/**\n * The Intent Protocol is the heart of Invariance.\n *\n * Every verified action follows the same four-step handshake:\n * **Request -> Approve -> Execute -> Verify**.\n *\n * The proof generated at the end looks identical regardless of who\n * performed the action (agent, human, or device).\n *\n * @example\n * ```typescript\n * const trade = await inv.intent.request({\n * actor: { type: 'agent', address: '0xTradingBot' },\n * action: 'swap',\n * params: { from: 'USDC', to: 'ETH', amount: '100' },\n * approval: 'auto',\n * });\n * console.log(trade.explorerUrl);\n * ```\n */\nexport class IntentProtocol {\n private readonly contracts: ContractFactory;\n private readonly events: InvarianceEventEmitter;\n private readonly telemetry: Telemetry;\n private indexer: IndexerClient | null = null;\n private x402: X402Manager | null = null;\n\n constructor(\n contracts: ContractFactory,\n events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ) {\n this.contracts = contracts;\n this.events = events;\n this.telemetry = telemetry;\n }\n\n /** Lazily initialize the X402 manager */\n private getX402Manager(): X402Manager {\n if (!this.x402) {\n this.x402 = new X402Manager(this.contracts, this.events, this.telemetry);\n }\n return this.x402;\n }\n\n /** Lazily initialize the indexer client */\n private getIndexer(): IndexerClient {\n if (!this.indexer) {\n this.indexer = new IndexerClient(this.contracts.getApiBaseUrl(), this.contracts.getApiKey());\n }\n return this.indexer;\n }\n\n /**\n * Full intent handshake: request, approve, execute, verify.\n *\n * This is the primary method for performing verified actions.\n * The approval method determines how the intent is approved:\n * - 'auto': Policy engine auto-approves (for agents)\n * - 'wallet-signature': Requires wallet signature (for humans)\n * - 'multi-sig': M-of-N approval required\n *\n * @param opts - Intent request options\n * @returns The completed intent result with proof bundle\n */\n async request(opts: IntentRequestOptions): Promise<IntentResult> {\n this.telemetry.track('intent.request', {\n action: opts.action,\n approval: opts.approval ?? 'auto',\n });\n\n try {\n const contract = this.contracts.getContract('intent');\n const identityContract = this.contracts.getContract('identity');\n\n // Resolve actor identity ID\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n const identityId = await resolveFn([opts.actor.address as `0x${string}`]) as `0x${string}`;\n\n // Handle x402 payment if enabled\n if (opts.payment?.enabled) {\n const x402 = this.getX402Manager();\n\n if (opts.payment.receiptId) {\n // Verify existing payment receipt\n const verification = await x402.verifyPayment(opts.payment.receiptId);\n if (!verification.valid) {\n throw new InvarianceError(\n ErrorCode.PAYMENT_VERIFICATION_FAILED,\n `Payment verification failed: ${verification.reason}`,\n );\n }\n // Attach verified receipt ID to metadata\n opts.metadata = {\n ...opts.metadata,\n paymentReceiptId: opts.payment.receiptId,\n };\n } else {\n // Create a new payment\n const recipient = opts.payment.recipient ?? opts.target ?? '';\n if (!recipient) {\n throw new InvarianceError(\n ErrorCode.PAYMENT_REQUIRED,\n 'Payment recipient is required when payment is enabled',\n );\n }\n const amount = opts.payment.maxCost ?? '0.01';\n const receipt = await x402.payForAction({\n action: opts.action,\n amount,\n recipient,\n identityId: fromBytes32(identityId),\n });\n // Attach payment receipt ID to metadata\n opts.metadata = {\n ...opts.metadata,\n paymentReceiptId: receipt.paymentId,\n paymentPayloadHash: receipt.payloadHash,\n };\n }\n }\n\n // Prepare request parameters\n const actionBytes = toBytes32(opts.action);\n const targetAddress = (opts.target ?? '0x0000000000000000000000000000000000000000') as `0x${string}`;\n const value = opts.amount !== undefined ? parseBaseUnitAmount(opts.amount, 'amount') : 0n;\n const data = opts.params ? (stringToHex(JSON.stringify(opts.params)) as `0x${string}`) : '0x' as `0x${string}`;\n const description = (opts.metadata?.['description'] as string | undefined) ?? opts.action;\n const metadataHash = hashMetadata(opts.metadata ?? {});\n const expiresAt = BigInt((opts.metadata?.['expiresAt'] as number | undefined) ?? 0);\n\n // Submit intent to contract\n const requestFn = contract.write['request'];\n if (!requestFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'request function not found');\n const txHash = await requestFn([\n identityId,\n actionBytes,\n targetAddress,\n value,\n data,\n description,\n metadataHash,\n expiresAt,\n ]);\n\n const optimistic = this.contracts.getConfirmation() === 'optimistic';\n const receiptClient = this.contracts.getReceiptClient();\n const receipt = await waitForReceipt(receiptClient, txHash, { optimistic });\n const intentId = optimistic\n ? toBytes32(txHash) // Use txHash as placeholder ID in optimistic mode\n : parseIntentIdFromLogs(receipt.logs);\n\n // Auto-approve if requested\n if (opts.approval === 'auto') {\n const approveFn = contract.write['approve'];\n if (!approveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'approve function not found');\n await approveFn([intentId, identityId, 'Auto-approved by policy engine']);\n }\n\n // Generate proof bundle\n const metadata = opts.metadata ?? {};\n const walletClient = this.contracts.getWalletClient();\n const actorSig = await generateActorSignature({ action: opts.action, metadata }, walletClient);\n const platformSig = generatePlatformCommitment({ action: opts.action, metadata });\n\n const proof = {\n proofHash: metadataHash,\n signatures: {\n actor: actorSig,\n platform: platformSig,\n valid: true,\n },\n metadataHash,\n verifiable: true,\n raw: JSON.stringify({ intentId: fromBytes32(intentId), txHash, action: opts.action }),\n };\n\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const result: IntentResult = {\n intentId: fromBytes32(intentId),\n status: opts.approval === 'auto' ? 'completed' : 'pending',\n actor: opts.actor,\n action: opts.action,\n proof,\n txHash: receipt.txHash,\n timestamp: Date.now(),\n blockNumber: receipt.blockNumber,\n explorerUrl: `${explorerBase}/tx/${receipt.txHash}`,\n logId: fromBytes32(intentId),\n };\n\n const requestedPayload: {\n intentId: string;\n action: string;\n requester: string;\n requesterIdentityId: string;\n target?: string;\n value?: string;\n } = {\n intentId: result.intentId,\n action: opts.action,\n requester: opts.actor.address,\n requesterIdentityId: fromBytes32(identityId),\n };\n if (opts.target !== undefined) requestedPayload.target = opts.target;\n if (opts.amount !== undefined) requestedPayload.value = opts.amount;\n this.events.emit('intent.requested', requestedPayload);\n\n return result;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Single-transaction atomic verification using CompactLedger + AtomicVerifier.\n *\n * Collapses identity check + policy evaluation + ledger log into one tx.\n * ~86% gas reduction compared to the full intent handshake.\n *\n * @param opts - Intent request options\n * @returns The completed intent result with proof bundle\n */\n async requestAtomic(opts: IntentRequestOptions): Promise<IntentResult> {\n this.telemetry.track('intent.requestAtomic', {\n action: opts.action,\n });\n\n try {\n const identityContract = this.contracts.getContract('identity');\n const atomicVerifier = this.contracts.getContract('atomicVerifier');\n\n // Resolve actor identity ID\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n const identityId = await resolveFn([opts.actor.address as `0x${string}`]) as `0x${string}`;\n\n // Build compact log input\n const metadata = opts.metadata ?? {};\n const metadataHash = hashMetadata(metadata);\n const walletClient = this.contracts.getWalletClient();\n const actorSig = await generateActorSignature({ action: opts.action, metadata }, walletClient);\n const platformSig = await generatePlatformCommitment({ action: opts.action, metadata });\n\n const compactInput = {\n actorIdentityId: identityId,\n actorAddress: opts.actor.address,\n action: opts.action,\n category: (opts.metadata?.['category'] as string | undefined) ?? 'custom',\n metadataHash,\n proofHash: metadataHash,\n severity: 0, // Info\n };\n\n // Single tx: verifyAndLog\n const verifyAndLogFn = atomicVerifier.write['verifyAndLog'];\n if (!verifyAndLogFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'verifyAndLog function not found');\n const txHash = await verifyAndLogFn([compactInput, actorSig, platformSig]);\n\n const optimistic = this.contracts.getConfirmation() === 'optimistic';\n const receiptClient = this.contracts.getReceiptClient();\n const receipt = await waitForReceipt(receiptClient, txHash, { optimistic });\n const entryId = optimistic\n ? toBytes32(txHash)\n : parseIntentIdFromLogs(receipt.logs);\n\n const proof = {\n proofHash: metadataHash,\n signatures: {\n actor: actorSig,\n platform: platformSig,\n valid: true,\n },\n metadataHash,\n verifiable: true,\n raw: JSON.stringify({ entryId: fromBytes32(entryId), txHash, action: opts.action, mode: 'atomic' }),\n };\n\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const result: IntentResult = {\n intentId: fromBytes32(entryId),\n status: 'completed',\n actor: opts.actor,\n action: opts.action,\n proof,\n txHash: receipt.txHash,\n timestamp: Date.now(),\n blockNumber: receipt.blockNumber,\n explorerUrl: `${explorerBase}/tx/${receipt.txHash}`,\n logId: fromBytes32(entryId),\n };\n\n const atomicRequestedPayload: {\n intentId: string;\n action: string;\n requester: string;\n requesterIdentityId: string;\n target?: string;\n value?: string;\n mode: string;\n } = {\n intentId: result.intentId,\n action: opts.action,\n requester: opts.actor.address,\n requesterIdentityId: fromBytes32(identityId),\n mode: 'atomic',\n };\n if (opts.target !== undefined) atomicRequestedPayload.target = opts.target;\n if (opts.amount !== undefined) atomicRequestedPayload.value = opts.amount;\n this.events.emit('intent.requested', atomicRequestedPayload);\n\n return result;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Prepare an intent without executing (dry-run).\n *\n * Useful for checking if an intent would succeed, estimating gas,\n * and previewing policy evaluations before committing.\n *\n * @param opts - Intent request options\n * @returns Prepared intent with policy checks and gas estimate\n */\n async prepare(opts: IntentRequestOptions): Promise<PreparedIntent> {\n this.telemetry.track('intent.prepare', { action: opts.action });\n\n try {\n const identityContract = this.contracts.getContract('identity');\n const policyContract = this.contracts.getContract('policy');\n const publicClient = this.contracts.getPublicClient();\n\n // Resolve actor identity ID\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n const identityId = await resolveFn([opts.actor.address as `0x${string}`]) as `0x${string}`;\n\n // Check identity status\n const isActiveFn = identityContract.read['isActive'];\n if (!isActiveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'isActive function not found');\n const isActive = await isActiveFn([identityId]) as boolean;\n\n const warnings: string[] = [];\n if (!isActive) {\n warnings.push('Identity is not active');\n }\n\n // Evaluate against policies\n const actionBytes = toBytes32(opts.action);\n const targetAddress = (opts.target ?? '0x0000000000000000000000000000000000000000') as `0x${string}`;\n const value = opts.amount !== undefined ? parseBaseUnitAmount(opts.amount, 'amount') : 0n;\n const data = opts.params ? (stringToHex(JSON.stringify(opts.params)) as `0x${string}`) : '0x' as `0x${string}`;\n\n const evaluateFn = policyContract.read['evaluate'];\n let wouldSucceed = isActive;\n const policyChecks = [];\n\n if (evaluateFn) {\n try {\n const [allowed, reason] = await evaluateFn([identityId, actionBytes, targetAddress, value, data]) as [boolean, string];\n wouldSucceed = wouldSucceed && allowed;\n policyChecks.push({\n rule: 'policy-evaluation',\n passed: allowed,\n detail: reason || (allowed ? 'Policy check passed' : 'Policy check failed'),\n });\n if (!allowed) {\n warnings.push(`Policy denied: ${reason}`);\n }\n } catch {\n warnings.push('Policy evaluation failed');\n }\n }\n\n // Estimate gas\n const gasPrice = await publicClient.getGasPrice();\n const gasLimit = 150000;\n const gasCostWei = gasPrice * BigInt(gasLimit);\n const { formatEther } = await import('viem');\n const ethCost = formatEther(gasCostWei);\n const estimatedGas = {\n ethCost,\n usdcCost: '0', // Requires price oracle — not estimated here\n gasLimit,\n gasPrice: gasPrice.toString(),\n strategy: this.contracts.getGasStrategy(),\n };\n\n const intentId = `inv_int_${Date.now().toString(36)}`;\n\n return {\n intentId,\n wouldSucceed,\n policyChecks,\n estimatedGas,\n warnings,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Manually approve a pending intent.\n *\n * Used when an intent requires wallet signature or multi-sig approval\n * and the signer wants to approve it explicitly.\n *\n * @param intentId - The intent to approve\n * @returns Approval result with threshold status\n */\n async approve(intentId: string): Promise<ApprovalResult> {\n this.telemetry.track('intent.approve');\n\n try {\n const contract = this.contracts.getContract('intent');\n const identityContract = this.contracts.getContract('identity');\n const publicClient = this.contracts.getPublicClient();\n\n // Get current signer address\n const signerAddress = this.contracts.getWalletAddress() as `0x${string}`;\n\n // Resolve approver identity ID\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n const approverIdentityId = await resolveFn([signerAddress]) as `0x${string}`;\n\n // Approve the intent\n const intentIdBytes = toBytes32(intentId);\n const approveFn = contract.write['approve'];\n if (!approveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'approve function not found');\n const txHash = await approveFn([intentIdBytes, approverIdentityId, 'Manual approval']);\n\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Get updated approval count\n const verifyFn = contract.read['verify'];\n if (!verifyFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'verify function not found');\n const [, approvals] = await verifyFn([intentIdBytes]) as [OnChainIntent, OnChainApproval[]];\n\n return {\n signer: signerAddress,\n txHash: receipt.txHash,\n approvalsReceived: approvals.length,\n thresholdMet: approvals.length > 0,\n remaining: 0,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Reject a pending intent.\n *\n * @param intentId - The intent to reject\n * @param reason - Optional reason for rejection\n * @returns Transaction receipt\n */\n async reject(intentId: string, reason?: string): Promise<TxReceipt> {\n this.telemetry.track('intent.reject');\n\n try {\n const contract = this.contracts.getContract('intent');\n const publicClient = this.contracts.getPublicClient();\n\n const intentIdBytes = toBytes32(intentId);\n const rejectFn = contract.write['reject'];\n if (!rejectFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'reject function not found');\n const txHash = await rejectFn([intentIdBytes, reason ?? 'Manually rejected']);\n\n const receipt = await waitForReceipt(publicClient, txHash);\n\n this.events.emit('intent.rejected', {\n intentId,\n reason: reason ?? 'Manually rejected',\n rejector: this.contracts.getWalletAddress(),\n });\n\n return {\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n status: receipt.status,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Check the lifecycle status of an intent.\n *\n * @param intentId - The intent to check\n * @returns Current intent status with approval details\n */\n async status(intentId: string): Promise<IntentStatus> {\n this.telemetry.track('intent.status');\n\n try {\n const contract = this.contracts.getContract('intent');\n\n const intentIdBytes = toBytes32(intentId);\n const verifyFn = contract.read['verify'];\n if (!verifyFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'verify function not found');\n const [intent, approvals] = await verifyFn([intentIdBytes]) as [OnChainIntent, OnChainApproval[]];\n\n if (intent.createdAt === 0n) {\n throw new InvarianceError(\n ErrorCode.INTENT_EXPIRED,\n `Intent not found: ${intentId}`,\n );\n }\n\n const lifecycle = intentStatusFromEnum(intent.status);\n const explorerBase = this.contracts.getExplorerBaseUrl();\n\n const result: IntentStatus = {\n intentId: fromBytes32(intent.intentId),\n lifecycle,\n actor: {\n type: 'agent',\n address: intent.requester,\n },\n action: fromBytes32(intent.action),\n explorerUrl: `${explorerBase}/intent/${fromBytes32(intent.intentId)}`,\n };\n\n if (approvals.length > 0) {\n result.approvals = {\n required: 1,\n received: approvals.length,\n signers: approvals.map((a) => ({\n address: a.approver,\n approved: true,\n timestamp: Number(a.approvedAt),\n })),\n };\n }\n\n if (intent.completedAt > 0n) {\n // For completed intents, reconstruct commitment hashes (we may not be the original actor)\n const platformSig = generatePlatformCommitment({ action: result.action });\n const actorSig = platformSig; // Commitment placeholder — original actor signature is on-chain\n\n result.proof = {\n proofHash: intent.resultHash,\n signatures: {\n actor: actorSig,\n platform: platformSig,\n valid: true,\n },\n metadataHash: intent.metadataHash,\n verifiable: true,\n raw: JSON.stringify({ intentId: fromBytes32(intent.intentId), completedAt: Number(intent.completedAt) }),\n };\n }\n\n return result;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Request an intent with automatic retry on transient failures.\n *\n * Retries on NETWORK_ERROR, RPC_ERROR, and TIMEOUT by default.\n * Uses exponential backoff between attempts.\n *\n * @param opts - Intent request options\n * @param retryConfig - Retry behavior configuration\n * @returns Result with attempt history\n *\n * @example\n * ```typescript\n * const result = await inv.intent.requestWithRetry(\n * { actor, action: 'swap', params, approval: 'auto' },\n * { maxAttempts: 3, initialDelayMs: 1000, backoffMultiplier: 2 }\n * );\n * ```\n */\n async requestWithRetry(opts: IntentRequestOptions, retryConfig: RetryConfig = {}): Promise<RetryResult> {\n const {\n maxAttempts = 3,\n initialDelayMs = 1000,\n backoffMultiplier = 2,\n retryableErrors = ['NETWORK_ERROR', 'RPC_ERROR', 'TIMEOUT'],\n } = retryConfig;\n\n const errors: RetryResult['errors'] = [];\n let delay = initialDelayMs;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const result = await this.request(opts);\n return { result, attempts: attempt, errors, success: true };\n } catch (err) {\n const code = (err as { code?: string }).code ?? 'UNKNOWN';\n const message = err instanceof Error ? err.message : String(err);\n errors.push({ attempt, error: message, code });\n\n const isRetryable = retryableErrors.some((rc) => code.includes(rc) || message.includes(rc));\n if (!isRetryable || attempt === maxAttempts) {\n return { result: null, attempts: attempt, errors, success: false };\n }\n\n await new Promise((resolve) => setTimeout(resolve, delay));\n delay *= backoffMultiplier;\n }\n }\n\n return { result: null, attempts: maxAttempts, errors, success: false };\n }\n\n /**\n * Query intent history with filters.\n *\n * @param filters - Optional filters for actor, action, status, time range\n * @returns Array of completed intent results\n */\n async history(filters?: IntentHistoryFilters): Promise<IntentResult[]> {\n this.telemetry.track('intent.history', { hasFilters: filters !== undefined });\n\n try {\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (!available) {\n return [];\n }\n\n const pageSize = Math.max(1, filters?.limit ?? 50);\n const offset = Math.max(0, filters?.offset ?? 0);\n const page = Math.floor(offset / pageSize) + 1;\n const params: Record<string, string | number | undefined> = {\n actorAddress: filters?.actor,\n action: Array.isArray(filters?.action) ? filters.action.join(',') : filters?.action,\n status: filters?.status,\n page,\n pageSize,\n };\n\n const rows = await indexer.get<Record<string, unknown>[]>('/intents', params);\n const explorerBase = this.contracts.getExplorerBaseUrl();\n return rows.map((row) => mapIntentRow(row, explorerBase));\n } catch (err) {\n this.telemetry.track('intent.history.error', { error: String(err) });\n return [];\n }\n }\n}\n","import { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../errors/InvarianceError.js';\n\n/**\n * Parse a base-unit amount (integer string) into bigint.\n *\n * Accepts:\n * - bigint\n * - number (must be a non-negative integer)\n * - string of digits (non-negative integer, no decimals)\n */\nexport function parseBaseUnitAmount(\n value: string | number | bigint,\n fieldName = 'amount',\n): bigint {\n if (typeof value === 'bigint') return value;\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || !Number.isInteger(value) || value < 0) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Invalid ${fieldName}: ${value}. Must be a non-negative integer in base units.`,\n );\n }\n return BigInt(value);\n }\n\n if (typeof value === 'string') {\n if (!/^[0-9]+$/.test(value)) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Invalid ${fieldName}: ${value}. Must be a non-negative integer string in base units (no decimals).`,\n );\n }\n return BigInt(value);\n }\n\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Invalid ${fieldName}: unsupported type. Must be a bigint, number, or numeric string.`,\n );\n}\n","import type { PolicyRule } from '@invariance/common';\nimport { ErrorCode } from '@invariance/common';\nimport { encodeAbiParameters, decodeAbiParameters, stringToHex, hexToString } from 'viem';\nimport { parseBaseUnitAmount } from '../../utils/amounts.js';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport { policyRuleTypeToEnum, enumToPolicyRuleType, toBytes32 } from '../../utils/contract-helpers.js';\n\n/**\n * Parse a time value as an hour-of-day (0-23).\n *\n * Accepts:\n * - number (0-23)\n * - numeric string (0-23)\n * - HH:MM string (minutes must be 00)\n */\nfunction parseHourValue(value: string | number): bigint {\n if (typeof value === 'number') {\n if (!Number.isInteger(value) || value < 0 || value > 23) {\n throw new Error(`Invalid time value: ${value}. Hours must be an integer from 0-23.`);\n }\n return BigInt(value);\n }\n\n const match = value.match(/^(\\d{1,2}):(\\d{2})$/);\n if (match) {\n const hours = parseInt(match[1]!, 10);\n const minutes = parseInt(match[2]!, 10);\n if (hours < 0 || hours > 23) {\n throw new Error(`Invalid time value: ${value}. Hours must be 0-23.`);\n }\n if (minutes !== 0) {\n throw new Error(`Invalid time value: ${value}. Minutes must be 00 (hour precision only).`);\n }\n return BigInt(hours);\n }\n\n const numeric = Number(value);\n if (!Number.isInteger(numeric) || numeric < 0 || numeric > 23) {\n throw new Error(`Invalid time value: ${value}. Hours must be an integer from 0-23.`);\n }\n return BigInt(numeric);\n}\n\n/** On-chain representation of a policy rule */\nexport interface OnChainPolicyRule {\n ruleType: number;\n config: `0x${string}`;\n}\n\n/** Rule types that encode a single uint256 */\nconst UINT256_RULE_TYPES = new Set([\n 'max-spend',\n 'max-per-tx',\n 'daily-limit',\n 'require-balance',\n]);\n\n/** Rule types that encode a bytes32[] (action identifiers) */\nconst BYTES32_ARRAY_RULE_TYPES = new Set([\n 'action-whitelist',\n 'action-blacklist',\n]);\n\n/** Rule types that encode an address[] */\nconst ADDRESS_ARRAY_RULE_TYPES = new Set([\n 'target-whitelist',\n 'target-blacklist',\n]);\n\n/** Rule types that are encoded as Custom on-chain but need SDK-level decoding */\nconst CUSTOM_ENCODED_RULE_TYPES = new Set<PolicyRule['type']>([\n 'require-payment',\n]);\n\n/**\n * Serialize a PolicyRule to its on-chain representation.\n * Encodes the config object as ABI-encoded bytes matching the contract's expected format.\n *\n * @param rule - The SDK policy rule\n * @returns The on-chain rule format\n */\nexport function serializeRule(rule: PolicyRule): OnChainPolicyRule {\n const ruleType = policyRuleTypeToEnum(rule.type);\n\n if (Object.keys(rule.config).length === 0) {\n return { ruleType, config: '0x' };\n }\n\n let config: `0x${string}`;\n\n if (UINT256_RULE_TYPES.has(rule.type)) {\n // Contract expects abi.decode(config, (uint256))\n // Canonical key: 'limit' (for spend rules) or 'minBalance' (for require-balance)\n if (rule.config['amount'] !== undefined && rule.config['limit'] === undefined) {\n console.warn(`[Invariance] Deprecation: use \"limit\" instead of \"amount\" in ${rule.type} rule config.`);\n }\n if (rule.type === 'require-balance' && rule.config['limit'] !== undefined && rule.config['minBalance'] === undefined) {\n console.warn(`[Invariance] Deprecation: use \"minBalance\" instead of \"limit\" in require-balance rule config.`);\n }\n const raw =\n rule.type === 'require-balance'\n ? (rule.config['minBalance'] ?? rule.config['limit'] ?? rule.config['amount'])\n : (rule.config['limit'] ?? rule.config['amount']);\n if (raw === undefined) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Missing required numeric config for rule type \"${rule.type}\".`,\n );\n }\n const limit = parseBaseUnitAmount(raw as string | number | bigint, `${rule.type}.limit`);\n config = encodeAbiParameters([{ type: 'uint256' }], [limit]);\n } else if (BYTES32_ARRAY_RULE_TYPES.has(rule.type)) {\n // Contract expects abi.decode(config, (bytes32[]))\n const items = (rule.config['actions'] as string[]) ?? [];\n if (items.length === 0) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Empty actions array for rule type \"${rule.type}\". This would block all actions — pass at least one action.`,\n );\n }\n config = encodeAbiParameters(\n [{ type: 'bytes32[]' }],\n [items.map((item) => toBytes32(item))],\n );\n } else if (ADDRESS_ARRAY_RULE_TYPES.has(rule.type)) {\n // Contract expects abi.decode(config, (address[]))\n const addresses = (rule.config['targets'] as `0x${string}`[]) ?? [];\n config = encodeAbiParameters([{ type: 'address[]' }], [addresses]);\n } else if (rule.type === 'time-window') {\n // Contract expects abi.decode(config, (uint256, uint256))\n // Values are hours (0-23) or HH:MM strings (minutes must be 00)\n const start = parseHourValue((rule.config['start'] as string | number) ?? 0);\n const end = parseHourValue((rule.config['end'] as string | number) ?? 0);\n if (end <= start) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Invalid time-window: end (${end}) must be greater than start (${start}). This would block all actions.`,\n );\n }\n config = encodeAbiParameters(\n [{ type: 'uint256' }, { type: 'uint256' }],\n [start, end],\n );\n } else {\n // Opaque types (cooldown, rate-limit, custom, etc.): keep JSON-to-hex\n const configJson = CUSTOM_ENCODED_RULE_TYPES.has(rule.type)\n ? JSON.stringify({ ...rule.config, type: rule.type })\n : JSON.stringify(rule.config);\n config = stringToHex(configJson) as `0x${string}`;\n }\n\n return { ruleType, config };\n}\n\n/**\n * Deserialize an on-chain policy rule to the SDK format.\n *\n * @param onChainRule - The on-chain rule tuple\n * @returns The SDK policy rule\n */\nexport function deserializeRule(onChainRule: OnChainPolicyRule): PolicyRule {\n const type = enumToPolicyRuleType(onChainRule.ruleType);\n\n if (!onChainRule.config || onChainRule.config === '0x') {\n return { type: type as PolicyRule['type'], config: {} };\n }\n\n let config: Record<string, unknown> = {};\n\n try {\n if (UINT256_RULE_TYPES.has(type)) {\n const [limit] = decodeAbiParameters([{ type: 'uint256' }], onChainRule.config);\n config = { limit: limit.toString() };\n } else if (BYTES32_ARRAY_RULE_TYPES.has(type)) {\n const [items] = decodeAbiParameters([{ type: 'bytes32[]' }], onChainRule.config);\n config = { actions: [...items] };\n } else if (ADDRESS_ARRAY_RULE_TYPES.has(type)) {\n const [addresses] = decodeAbiParameters([{ type: 'address[]' }], onChainRule.config);\n config = { targets: [...addresses] };\n } else if (type === 'time-window') {\n const [start, end] = decodeAbiParameters(\n [{ type: 'uint256' }, { type: 'uint256' }],\n onChainRule.config,\n );\n config = { start: start.toString(), end: end.toString() };\n } else {\n // Opaque types: try JSON decode\n const configJson = hexToString(onChainRule.config);\n config = JSON.parse(configJson) as Record<string, unknown>;\n\n if (type === 'custom') {\n const taggedType = config['type'];\n if (typeof taggedType === 'string' && CUSTOM_ENCODED_RULE_TYPES.has(taggedType as PolicyRule['type'])) {\n const rest = Object.fromEntries(\n Object.entries(config).filter(([key]) => key !== 'type'),\n ) as Record<string, unknown>;\n return { type: taggedType as PolicyRule['type'], config: rest };\n }\n }\n }\n } catch {\n // If decoding fails, leave config empty\n config = {};\n }\n\n return { type: type as PolicyRule['type'], config };\n}\n\n/**\n * Serialize an array of policy rules.\n *\n * @param rules - Array of SDK policy rules\n * @returns Array of on-chain rule tuples\n */\nexport function serializeRules(rules: PolicyRule[]): OnChainPolicyRule[] {\n return rules.map(serializeRule);\n}\n\n/**\n * Deserialize an array of on-chain policy rules.\n *\n * @param onChainRules - Array of on-chain rule tuples\n * @returns Array of SDK policy rules\n */\nexport function deserializeRules(onChainRules: OnChainPolicyRule[]): PolicyRule[] {\n return onChainRules.map(deserializeRule);\n}\n","import type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport type { ActorType } from '@invariance/common';\nimport { ErrorCode } from '@invariance/common';\nimport type { Unsubscribe } from '@invariance/common';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport {\n toBytes32,\n fromBytes32,\n waitForReceipt,\n mapContractError,\n policyStateFromEnum,\n mapActorTypesToEnums,\n enumToActorType,\n} from '../../utils/contract-helpers.js';\nimport { IndexerClient } from '../../utils/indexer-client.js';\nimport { mapPolicyRow } from '../../utils/indexer-mappers.js';\nimport { serializeRules, deserializeRules } from './rule-serializer.js';\nimport { X402Manager } from '../x402/X402Manager.js';\nimport { parseBaseUnitAmount } from '../../utils/amounts.js';\nimport type {\n CreatePolicyOptions,\n SpecPolicy,\n PolicyStatus,\n EvaluationResult,\n TxReceipt,\n EvaluateOptions,\n PolicyListFilters,\n PolicyViolationCallback,\n OnChainPolicy,\n OnChainPolicyRule,\n PolicyTemplate,\n} from './types.js';\nimport {\n buildPolicyFromTemplate,\n defineTemplate as defineTemplateInternal,\n listTemplates as listTemplatesInternal,\n} from './templates.js';\nimport { keccak256, toHex } from 'viem';\n\n/** Zero bytes32 constant */\nconst ZERO_BYTES32 = '0x0000000000000000000000000000000000000000000000000000000000000000' as const;\n\n/** Event signature hashes for log parsing */\nconst POLICY_CREATED_EVENT = keccak256(toHex('PolicyCreated(bytes32,string,address,uint256)'));\nconst POLICY_COMPOSED_EVENT = keccak256(toHex('PolicyComposed(bytes32,bytes32,bytes32)'));\n\n/**\n * Composable, verifiable condition sets for action control.\n *\n * The Policy Engine replaces simple permissions with composable, verifiable\n * condition sets. A policy is a set of rules: can I do this, under these\n * conditions, with these constraints, verified by these parties?\n *\n * @example\n * ```typescript\n * const policy = await inv.policy.create({\n * name: 'Daily Trading Limits',\n * actor: 'agent',\n * rules: [\n * { type: 'max-spend', config: { limit: '1000', period: '24h' } },\n * { type: 'action-whitelist', config: { actions: ['swap'] } },\n * ],\n * });\n * await inv.policy.attach(policy.policyId, agent.identityId);\n * ```\n */\nexport class PolicyEngine {\n private readonly contracts: ContractFactory;\n private readonly events: InvarianceEventEmitter;\n private readonly telemetry: Telemetry;\n private indexer: IndexerClient | null = null;\n private x402: X402Manager | null = null;\n\n constructor(\n contracts: ContractFactory,\n events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ) {\n this.contracts = contracts;\n this.events = events;\n this.telemetry = telemetry;\n }\n\n /** Lazily initialize the X402 manager */\n private getX402Manager(): X402Manager {\n if (!this.x402) {\n this.x402 = new X402Manager(this.contracts, this.events, this.telemetry);\n }\n return this.x402;\n }\n\n /** Lazily initialize the indexer client */\n private getIndexer(): IndexerClient {\n if (!this.indexer) {\n this.indexer = new IndexerClient(this.contracts.getApiBaseUrl(), this.contracts.getApiKey());\n }\n return this.indexer;\n }\n\n /** Map an on-chain policy tuple to the SDK SpecPolicy type */\n private mapOnChainPolicy(raw: OnChainPolicy, rules: OnChainPolicyRule[], txHash?: string): SpecPolicy {\n const policyIdStr = fromBytes32(raw.policyId);\n\n // Map actor types\n let actor: ActorType | ActorType[] | null = null;\n if (raw.applicableActorTypes && raw.applicableActorTypes.length > 0) {\n const actorTypes = Array.from(raw.applicableActorTypes).map((t) => enumToActorType(t));\n actor = actorTypes.length === 1 ? (actorTypes[0] ?? null) : actorTypes;\n }\n\n return {\n policyId: policyIdStr || raw.policyId,\n name: raw.name,\n rules: deserializeRules(rules),\n actor,\n state: policyStateFromEnum(raw.state),\n attachedTo: [],\n createdAt: Number(raw.createdAt),\n txHash: txHash ?? '',\n };\n }\n\n /** Get the contract address for the policy module */\n getContractAddress(): string {\n return this.contracts.getAddress('policy');\n }\n\n /**\n * Create a new policy.\n *\n * Policies are registered on-chain and can be attached to one or more\n * identities. They support composable rules including spending limits,\n * time windows, action whitelists, and custom evaluators.\n *\n * @param opts - Policy creation options\n * @returns The created policy\n */\n async create(opts: CreatePolicyOptions): Promise<SpecPolicy> {\n if (!opts.rules || opts.rules.length === 0) {\n throw new InvarianceError(ErrorCode.POLICY_VIOLATION, 'Policy must have at least one rule.');\n }\n\n this.telemetry.track('policy.create', { ruleCount: opts.rules.length });\n\n try {\n const contract = this.contracts.getContract('policy');\n const publicClient = this.contracts.getPublicClient();\n\n // Serialize rules to on-chain format\n const onChainRules = serializeRules(opts.rules);\n\n // Map actor types to enums\n let applicableActorTypes: number[] = [];\n if (opts.actor) {\n const actors = Array.isArray(opts.actor) ? opts.actor : [opts.actor];\n applicableActorTypes = mapActorTypesToEnums(actors);\n }\n\n // Parse expiry\n const expiresAt = opts.expiry ? BigInt(new Date(opts.expiry).getTime() / 1000) : 0n;\n\n // Call contract\n const createFn = contract.write['create'];\n if (!createFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'create function not found on contract');\n const txHash = await createFn([opts.name, applicableActorTypes, expiresAt, onChainRules]);\n\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Read back the created policy from chain\n // Parse PolicyCreated event to get policyId\n let policyId: `0x${string}` = ZERO_BYTES32;\n for (const log of receipt.logs) {\n if (log.topics[0] === POLICY_CREATED_EVENT) {\n policyId = log.topics[1] as `0x${string}`;\n break;\n }\n }\n\n // If we couldn't get policyId from event, calculate it\n if (policyId === ZERO_BYTES32) {\n policyId = toBytes32(opts.name);\n }\n\n const getPolicyFn = contract.read['getPolicy'];\n if (!getPolicyFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getPolicy function not found on contract');\n const raw = await getPolicyFn([policyId]) as OnChainPolicy;\n\n const getRulesFn = contract.read['getRules'];\n if (!getRulesFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getRules function not found on contract');\n const rawRules = await getRulesFn([policyId]) as readonly OnChainPolicyRule[];\n\n const policy = this.mapOnChainPolicy(raw, Array.from(rawRules), receipt.txHash);\n\n // Emit event AFTER successful transaction\n this.events.emit('policy.created', {\n policyId: policy.policyId,\n name: opts.name,\n });\n\n return policy;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Attach a policy to an identity.\n *\n * Once attached, all actions by this identity will be evaluated\n * against the policy rules.\n *\n * @param policyId - The policy to attach\n * @param identityId - The identity to attach it to\n * @returns Transaction receipt\n */\n async attach(policyId: string, identityId: string): Promise<TxReceipt> {\n this.telemetry.track('policy.attach');\n\n try {\n const contract = this.contracts.getContract('policy');\n const publicClient = this.contracts.getPublicClient();\n\n const policyIdBytes = toBytes32(policyId);\n const identityIdBytes = toBytes32(identityId);\n\n const attachFn = contract.write['attach'];\n if (!attachFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'attach function not found on contract');\n const txHash = await attachFn([policyIdBytes, identityIdBytes]);\n\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Emit event AFTER successful transaction\n this.events.emit('policy.attached', {\n policyId,\n identityId,\n });\n\n return {\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n status: receipt.status,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Remove a policy from an identity.\n *\n * @param policyId - The policy to detach\n * @param identityId - The identity to detach it from\n * @returns Transaction receipt\n */\n async detach(policyId: string, identityId: string): Promise<TxReceipt> {\n this.telemetry.track('policy.detach');\n\n try {\n const contract = this.contracts.getContract('policy');\n const publicClient = this.contracts.getPublicClient();\n\n const policyIdBytes = toBytes32(policyId);\n const identityIdBytes = toBytes32(identityId);\n\n const detachFn = contract.write['detach'];\n if (!detachFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'detach function not found on contract');\n const txHash = await detachFn([policyIdBytes, identityIdBytes]);\n\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Emit event AFTER successful transaction\n this.events.emit('policy.detached', {\n policyId,\n identityId,\n });\n\n return {\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n status: receipt.status,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Check policy state and usage statistics.\n *\n * @param policyId - The policy to check\n * @returns Extended policy status with usage metrics\n */\n async status(policyId: string): Promise<PolicyStatus> {\n this.telemetry.track('policy.status');\n\n try {\n const contract = this.contracts.getContract('policy');\n const policyIdBytes = toBytes32(policyId);\n\n const getPolicyFn = contract.read['getPolicy'];\n if (!getPolicyFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getPolicy function not found on contract');\n const raw = await getPolicyFn([policyIdBytes]) as OnChainPolicy;\n\n if (raw.policyId === ZERO_BYTES32) {\n throw new InvarianceError(\n ErrorCode.POLICY_VIOLATION,\n `Policy not found: ${policyId}`,\n );\n }\n\n const getRulesFn = contract.read['getRules'];\n if (!getRulesFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getRules function not found on contract');\n const rawRules = await getRulesFn([policyIdBytes]) as readonly OnChainPolicyRule[];\n\n const policy = this.mapOnChainPolicy(raw, Array.from(rawRules));\n\n // Fetch usage stats from indexer, gracefully degrade to zeros\n let usage = { totalEvaluations: 0, violations: 0, spentByRule: {} as Record<string, string> };\n try {\n const indexer = this.getIndexer();\n const data = await indexer.get<{ totalEvaluations: number; violations: number; spentByRule?: Record<string, string> }>(`/policies/${policyId}/evaluations`);\n usage = {\n totalEvaluations: data.totalEvaluations,\n violations: data.violations,\n spentByRule: data.spentByRule ?? {},\n };\n } catch {\n // Indexer unavailable — use zeros\n }\n\n const status: PolicyStatus = {\n ...policy,\n usage,\n };\n\n if (raw.expiresAt > 0n) {\n status.expiresAt = Number(raw.expiresAt);\n }\n\n return status;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * List policies by identity, type, or status.\n *\n * @param filters - Optional filters\n * @returns Array of matching policies\n */\n async list(filters?: PolicyListFilters): Promise<SpecPolicy[]> {\n this.telemetry.track('policy.list', { hasFilters: filters !== undefined });\n\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (available) {\n try {\n const pageSize = Math.max(1, filters?.limit ?? 20);\n const offset = Math.max(0, filters?.offset ?? 0);\n const page = Math.floor(offset / pageSize) + 1;\n const params: Record<string, string | number | undefined> = {\n state: filters?.state,\n creator: filters?.actor,\n page,\n pageSize,\n };\n const rows = await indexer.get<Record<string, unknown>[]>('/policies', params);\n return rows.map((row) => mapPolicyRow(row));\n } catch (err) {\n this.telemetry.track('policy.list.error', { error: String(err) });\n }\n }\n\n // On-chain fallback: read policyCount and iterate (limited)\n try {\n const contract = this.contracts.getContract('policy');\n const countFn = contract.read['policyCount'];\n if (!countFn) return [];\n const count = await countFn([]) as bigint;\n const _limit = Math.min(Number(count), filters?.limit ?? 50);\n\n // On-chain sequential reads are expensive, cap at limit\n // NOTE: On-chain fallback is limited and cannot filter efficiently.\n // In production, the indexer should always be available.\n void _limit;\n return [];\n } catch (err) {\n this.telemetry.track('policy.list.fallback.error', { error: String(err) });\n return [];\n }\n }\n\n /**\n * Evaluate an action against a policy without executing.\n *\n * Returns detailed rule-by-rule evaluation results, remaining\n * budgets, and compliance proof if all rules pass.\n *\n * @param opts - Evaluation options (policy, actor, action)\n * @returns Detailed evaluation result per rule\n */\n async evaluate(opts: EvaluateOptions): Promise<EvaluationResult> {\n this.telemetry.track('policy.evaluate');\n\n try {\n const contract = this.contracts.getContract('policy');\n const identityContract = this.contracts.getContract('identity');\n\n let identityIdBytes: `0x${string}`;\n if (opts.actor.identityId) {\n identityIdBytes = toBytes32(opts.actor.identityId);\n } else {\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n identityIdBytes = await resolveFn([opts.actor.address as `0x${string}`]) as `0x${string}`;\n }\n const actionBytes = toBytes32(opts.action);\n const target = (opts.params?.['target'] as string) || '0x0000000000000000000000000000000000000000';\n const value = opts.amount ? parseBaseUnitAmount(opts.amount, 'amount') : 0n;\n const data = (opts.params?.['data'] as `0x${string}`) || '0x';\n\n const evaluateFn = contract.read['evaluate'];\n if (!evaluateFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'evaluate function not found on contract');\n const result = await evaluateFn([identityIdBytes, actionBytes, target as `0x${string}`, value, data]) as [boolean, `0x${string}`];\n\n let [allowed] = result;\n const ruleResults: { type: import('@invariance/common').PolicyRuleType; passed: boolean; detail: string; remaining?: string }[] = [];\n\n // Check for require-payment rules in the policy\n const policyIdBytes = toBytes32(opts.policyId);\n const getRulesFn = contract.read['getRules'];\n if (getRulesFn) {\n try {\n const rawRules = await getRulesFn([policyIdBytes]) as readonly OnChainPolicyRule[];\n const rules = deserializeRules(Array.from(rawRules));\n\n for (const rule of rules) {\n if (rule.type === 'require-payment') {\n const config = rule.config as { minAmount?: string; exemptActions?: string[] };\n const exemptActions = config.exemptActions ?? [];\n\n if (exemptActions.includes(opts.action)) {\n ruleResults.push({\n type: 'require-payment',\n passed: true,\n detail: `Action \"${opts.action}\" is exempt from payment requirement`,\n });\n continue;\n }\n\n if (!opts.paymentReceiptId) {\n allowed = false;\n ruleResults.push({\n type: 'require-payment',\n passed: false,\n detail: 'Payment required but no receipt provided',\n });\n continue;\n }\n\n // Verify payment receipt\n const x402 = this.getX402Manager();\n const verification = await x402.verifyPayment(opts.paymentReceiptId);\n const passed = verification.valid;\n\n if (!passed) {\n allowed = false;\n }\n\n ruleResults.push({\n type: 'require-payment',\n passed,\n detail: passed\n ? `Payment verified: ${opts.paymentReceiptId}`\n : `Payment verification failed: ${verification.reason}`,\n });\n }\n }\n } catch (err) {\n // Only swallow contract-read errors (e.g. function not found).\n // Rethrow network/RPC errors that indicate a real problem.\n const errMsg = err instanceof Error ? err.message : String(err);\n if (errMsg.includes('network') || errMsg.includes('timeout') || errMsg.includes('ECONNREFUSED') || errMsg.includes('fetch failed')) {\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Failed to read policy rules for payment verification: ${errMsg}`,\n );\n }\n this.telemetry.track('policy.evaluate.ruleReadSkipped', { error: errMsg });\n }\n }\n\n return {\n allowed,\n policyId: opts.policyId,\n ruleResults,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Revoke a policy entirely.\n *\n * Once revoked, the policy cannot be re-activated. All identities\n * with this policy attached will have it automatically detached.\n *\n * @param policyId - The policy to revoke\n * @returns Transaction receipt\n */\n async revoke(policyId: string): Promise<TxReceipt> {\n this.telemetry.track('policy.revoke');\n\n try {\n const contract = this.contracts.getContract('policy');\n const publicClient = this.contracts.getPublicClient();\n\n const policyIdBytes = toBytes32(policyId);\n\n const revokeFn = contract.write['revoke'];\n if (!revokeFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'revoke function not found on contract');\n const txHash = await revokeFn([policyIdBytes]);\n\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Emit event AFTER successful transaction\n this.events.emit('policy.revoked', {\n policyId,\n });\n\n return {\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n status: receipt.status,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Combine multiple policies into one composite policy.\n *\n * The composed policy evaluates all constituent rules. An action\n * must pass ALL rules from ALL composed policies to be allowed.\n *\n * @param policyIds - Array of policy IDs to compose\n * @returns The new composite policy\n */\n async compose(policyIds: string[]): Promise<SpecPolicy> {\n this.telemetry.track('policy.compose', { count: policyIds.length });\n\n try {\n if (policyIds.length < 2) {\n throw new InvarianceError(\n ErrorCode.POLICY_VIOLATION,\n 'compose() requires at least 2 policy IDs',\n );\n }\n\n if (policyIds.length > 2) {\n throw new InvarianceError(\n ErrorCode.POLICY_VIOLATION,\n `compose() supports exactly 2 policy IDs, got ${policyIds.length}. Chain multiple compose() calls for more.`,\n );\n }\n\n const contract = this.contracts.getContract('policy');\n const publicClient = this.contracts.getPublicClient();\n\n const rawIdA = policyIds[0];\n const rawIdB = policyIds[1];\n if (!rawIdA || !rawIdB) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n 'compose() requires two non-empty policy IDs',\n );\n }\n const policyIdA = toBytes32(rawIdA);\n const policyIdB = toBytes32(rawIdB);\n\n // Generate composite name\n const name = `Composite Policy (${policyIds.length} policies)`;\n\n const composeFn = contract.write['compose'];\n if (!composeFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'compose function not found on contract');\n const txHash = await composeFn([name, policyIdA, policyIdB, 0n]);\n\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Parse PolicyComposed event to get newPolicyId\n let newPolicyId: `0x${string}` = ZERO_BYTES32;\n for (const log of receipt.logs) {\n if (log.topics[0] === POLICY_COMPOSED_EVENT) {\n newPolicyId = log.topics[1] as `0x${string}`;\n break;\n }\n }\n\n // If we couldn't get policyId from event, calculate it\n if (newPolicyId === ZERO_BYTES32) {\n newPolicyId = toBytes32(name);\n }\n\n // Read back the composed policy\n const getPolicyFn = contract.read['getPolicy'];\n if (!getPolicyFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getPolicy function not found on contract');\n const raw = await getPolicyFn([newPolicyId]) as OnChainPolicy;\n\n const getRulesFn = contract.read['getRules'];\n if (!getRulesFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getRules function not found on contract');\n const rawRules = await getRulesFn([newPolicyId]) as readonly OnChainPolicyRule[];\n\n const policy = this.mapOnChainPolicy(raw, Array.from(rawRules), receipt.txHash);\n\n // Emit event AFTER successful transaction\n this.events.emit('policy.composed', {\n policyId: policy.policyId,\n name: policy.name,\n });\n\n return policy;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Create a policy from a pre-built template.\n *\n * @param templateName - Name of the template (e.g. 'defi-trading')\n * @param overrides - Optional overrides for expiry, actor, or additional rules\n * @returns The created policy\n *\n * @example\n * ```typescript\n * const policy = await inv.policy.fromTemplate('defi-trading', { expiry: '2025-12-31' });\n * ```\n */\n async fromTemplate(\n templateName: string,\n overrides?: { expiry?: string; actor?: import('@invariance/common').ActorType | import('@invariance/common').ActorType[]; additionalRules?: import('@invariance/common').PolicyRule[] },\n ): Promise<SpecPolicy> {\n if (templateName === 'full-autonomy') {\n console.warn('[Invariance] WARNING: \"full-autonomy\" template grants high limits with minimal restrictions. Use with caution.');\n }\n const opts = buildPolicyFromTemplate(templateName, overrides);\n return this.create(opts);\n }\n\n /**\n * Register a custom policy template.\n *\n * @param name - Template name\n * @param template - Template definition with description and rules\n *\n * @example\n * ```typescript\n * inv.policy.defineTemplate('my-custom', {\n * description: 'Custom policy for my use case',\n * rules: [{ type: 'max-spend', config: { amount: '500' } }],\n * });\n * ```\n */\n defineTemplate(name: string, template: Omit<PolicyTemplate, 'name' | 'builtin'>): void {\n defineTemplateInternal(name, template);\n }\n\n /**\n * List all available policy templates (built-in + custom).\n *\n * @returns Array of template metadata\n */\n listTemplates(): Array<{ name: string; description: string; builtin: boolean }> {\n return listTemplatesInternal();\n }\n\n /**\n * Subscribe to policy violations in real-time.\n *\n * @param policyId - The policy to monitor\n * @param callback - Called when a violation occurs\n * @returns Unsubscribe function\n */\n onViolation(policyId: string, callback: PolicyViolationCallback): Unsubscribe {\n this.telemetry.track('policy.onViolation');\n\n // Subscribe to SDK-level violation events filtered by policyId\n const unsubscribe = this.events.on('policy.violation', (data) => {\n if (data.policyId === policyId) {\n callback({\n policyId: data.policyId,\n action: data.action,\n detail: data.detail,\n timestamp: Date.now(),\n });\n }\n });\n\n return unsubscribe;\n }\n}\n","import type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport { ErrorCode } from '@invariance/common';\nimport type { ActorType, EscrowState, Unsubscribe } from '@invariance/common';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport { decodeAbiParameters, decodeEventLog } from 'viem';\nimport {\n toBytes32,\n fromBytes32,\n waitForReceipt,\n mapContractError,\n escrowConditionTypeToEnum,\n enumToEscrowConditionType,\n escrowStateFromEnum,\n enumToActorType,\n} from '../../utils/contract-helpers.js';\nimport { InvarianceEscrowAbi } from '../../contracts/abis/index.js';\nimport { IndexerClient } from '../../utils/indexer-client.js';\nimport { mapEscrowRow } from '../../utils/indexer-mappers.js';\nimport { toUSDCWei, fromUSDCWei } from '../../utils/usdc.js';\nimport type {\n CreateEscrowOptions,\n EscrowContract,\n EscrowStatus,\n ApprovalStatus,\n ApprovalResult,\n ResolveOptions,\n TxReceipt,\n EscrowListFilters,\n EscrowStateChangeCallback,\n ReleaseOptions,\n OnChainEscrow,\n} from './types.js';\n\n/** Zero bytes32 constant */\nconst ZERO_BYTES32 = '0x0000000000000000000000000000000000000000000000000000000000000000' as const;\n\n/**\n * USDC escrow with multi-sig, conditional release.\n *\n * Escrow is the payment primitive for any verified interaction.\n * Lock USDC, define release conditions, and funds only move when\n * conditions are cryptographically confirmed.\n *\n * @example\n * ```typescript\n * const escrow = await inv.escrow.create({\n * amount: '250.00',\n * recipient: { type: 'agent', address: '0xContentBot' },\n * conditions: { type: 'task-completion', timeout: '48h', arbiter: '0xPlatform' },\n * autoFund: true,\n * });\n * ```\n */\nexport class EscrowManager {\n private readonly contracts: ContractFactory;\n private readonly events: InvarianceEventEmitter;\n private readonly telemetry: Telemetry;\n private indexer: IndexerClient | null = null;\n\n constructor(\n contracts: ContractFactory,\n events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ) {\n this.contracts = contracts;\n this.events = events;\n this.telemetry = telemetry;\n }\n\n /** Lazily initialize the indexer client */\n private getIndexer(): IndexerClient {\n if (!this.indexer) {\n this.indexer = new IndexerClient(this.contracts.getApiBaseUrl(), this.contracts.getApiKey());\n }\n return this.indexer;\n }\n\n /** Get the contract address for the escrow module */\n getContractAddress(): string {\n return this.contracts.getAddress('escrow');\n }\n\n /**\n * Parse timeout string (e.g., '48h', '7d') to seconds.\n *\n * @param timeout - The timeout string\n * @returns Timeout in seconds\n */\n private parseTimeout(timeout: string): number {\n const match = timeout.match(/^(\\d+)([hdw])$/);\n if (!match) {\n throw new InvarianceError(\n ErrorCode.ESCROW_WRONG_STATE,\n `Invalid timeout format: ${timeout}`,\n );\n }\n const value = parseInt(match[1]!, 10);\n const unit = match[2]!;\n const multipliers: Record<string, number> = { h: 3600, d: 86400, w: 604800 };\n const seconds = value * (multipliers[unit] ?? 3600);\n const MAX_TIMEOUT_SECONDS = 365 * 86400; // 1 year\n if (seconds > MAX_TIMEOUT_SECONDS) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Timeout \"${timeout}\" exceeds maximum of 365 days (${MAX_TIMEOUT_SECONDS}s). Got ${seconds}s.`,\n );\n }\n return seconds;\n }\n\n /**\n * Resolve an identity ID to its actor type by querying the identity contract.\n *\n * @param identityId - The on-chain identity ID (bytes32)\n * @returns The actor type string\n */\n private async resolveActorType(identityId: `0x${string}`): Promise<ActorType> {\n if (identityId === ZERO_BYTES32) return 'agent';\n try {\n const identityContract = this.contracts.getContract('identity');\n const getFn = identityContract.read['get'];\n if (!getFn) return 'agent';\n const identity = await getFn([identityId]) as { actorType: number } | null;\n if (!identity) return 'agent';\n return enumToActorType(identity.actorType);\n } catch {\n return 'agent';\n }\n }\n\n /** Map an on-chain escrow tuple to the SDK EscrowContract type */\n private mapOnChainEscrow(\n raw: OnChainEscrow,\n txHash?: string,\n depositorType: ActorType = 'agent',\n recipientType: ActorType = 'agent',\n ): EscrowContract {\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const escrowIdStr = fromBytes32(raw.escrowId);\n\n // Decode condition data based on condition type\n const conditionType = enumToEscrowConditionType(raw.conditionType);\n const conditions: EscrowContract['conditions'] = {\n type: conditionType,\n timeout: '0h', // Will be calculated from expiresAt if needed\n };\n\n // Parse multi-sig config if applicable\n if (conditionType === 'multi-sig' && raw.conditionData !== ZERO_BYTES32 && raw.conditionData.length > 2) {\n try {\n const [signers, threshold, timeoutPerSigner] = decodeAbiParameters(\n [{ type: 'address[]' }, { type: 'uint256' }, { type: 'uint256' }],\n raw.conditionData,\n );\n conditions.multiSig = {\n signers: signers as string[],\n threshold: Number(threshold),\n };\n if (timeoutPerSigner > 0n) {\n conditions.timeout = `${Number(timeoutPerSigner)}s`;\n }\n } catch {\n // Fallback if conditionData is malformed\n conditions.multiSig = {\n signers: [],\n threshold: 0,\n };\n }\n }\n\n // Map state (SDK uses different naming)\n const stateMap: Record<string, import('@invariance/common').EscrowState> = {\n created: 'created',\n funded: 'funded',\n active: 'funded',\n released: 'released',\n refunded: 'refunded',\n disputed: 'disputed',\n resolved: 'released',\n };\n const onChainState = escrowStateFromEnum(raw.state);\n const sdkState = stateMap[onChainState] ?? 'created';\n\n return {\n escrowId: escrowIdStr || raw.escrowId,\n contractAddress: this.getContractAddress(),\n depositor: {\n type: depositorType,\n address: raw.depositor,\n },\n recipient: {\n type: recipientType,\n address: raw.beneficiary,\n },\n amount: fromUSDCWei(raw.amount),\n depositorIdentityId: fromBytes32(raw.depositorIdentityId),\n beneficiaryIdentityId: fromBytes32(raw.beneficiaryIdentityId),\n state: sdkState,\n conditions,\n createdAt: Number(raw.createdAt),\n txHash: txHash ?? '',\n explorerUrl: `${explorerBase}/escrow/${raw.escrowId}`,\n };\n }\n\n /**\n * Deploy a new escrow contract on Base.\n *\n * Creates an escrow with specified conditions: single-arbiter,\n * multi-sig, intent-linked, or milestone-based release.\n *\n * @param opts - Escrow creation options\n * @returns The deployed escrow contract details\n */\n async create(opts: CreateEscrowOptions): Promise<EscrowContract> {\n const parsedAmount = parseFloat(opts.amount);\n if (isNaN(parsedAmount) || parsedAmount <= 0) {\n throw new InvarianceError(ErrorCode.ESCROW_WRONG_STATE, `Invalid escrow amount: ${opts.amount}. Must be a positive number.`);\n }\n\n this.telemetry.track('escrow.create', {\n conditionType: opts.conditions.type,\n autoFund: opts.autoFund ?? false,\n });\n\n try {\n const contract = this.contracts.getContract('escrow');\n const publicClient = this.contracts.getPublicClient();\n const identityContract = this.contracts.getContract('identity');\n\n // Resolve depositor identity\n const depositorAddr = (opts.depositor?.address ?? this.contracts.getWalletAddress()) as `0x${string}`;\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found on identity contract');\n const depositorIdentityId = await resolveFn([depositorAddr]) as `0x${string}`;\n\n // Resolve recipient identity\n const recipientAddr = opts.recipient.address as `0x${string}`;\n const recipientIdentityId = await resolveFn([recipientAddr]) as `0x${string}`;\n\n // Calculate expiration timestamp\n const timeoutSeconds = this.parseTimeout(opts.conditions.timeout);\n const expiresAt = timeoutSeconds > 0 ? BigInt(Math.floor(Date.now() / 1000) + timeoutSeconds) : 0n;\n\n // Convert amount to USDC wei\n const amount = toUSDCWei(opts.amount);\n\n // Encode condition data\n const conditionType = escrowConditionTypeToEnum(opts.conditions.type);\n let conditionData: `0x${string}` = '0x';\n\n if (opts.conditions.type === 'multi-sig' && opts.conditions.multiSig) {\n const { signers, threshold, timeoutPerSigner } = opts.conditions.multiSig;\n const timeout = timeoutPerSigner ? this.parseTimeout(timeoutPerSigner) : 0;\n // ABI encode (address[], uint256, uint256)\n const { encodeAbiParameters } = await import('viem');\n conditionData = encodeAbiParameters(\n [\n { type: 'address[]' },\n { type: 'uint256' },\n { type: 'uint256' },\n ],\n [signers as `0x${string}`[], BigInt(threshold), BigInt(timeout)],\n );\n }\n\n // Call create() on contract\n const createFn = contract.write['create'];\n if (!createFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'create function not found on contract');\n const txHash = await createFn([\n depositorIdentityId,\n recipientIdentityId,\n recipientAddr,\n amount,\n conditionType,\n conditionData,\n expiresAt,\n ]);\n\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Extract escrowId from EscrowCreated event\n const firstLog = receipt.logs[0];\n if (!firstLog || !firstLog.topics[1]) {\n throw new InvarianceError(ErrorCode.TX_REVERTED, 'EscrowCreated event not found in transaction receipt');\n }\n const escrowIdFromEvent = firstLog.topics[1];\n\n // Read back the escrow from chain\n const getEscrowFn = contract.read['getEscrow'];\n if (!getEscrowFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getEscrow function not found on contract');\n const raw = await getEscrowFn([escrowIdFromEvent as `0x${string}`]) as OnChainEscrow;\n\n const [depositorType, recipientType] = await Promise.all([\n this.resolveActorType(raw.depositorIdentityId),\n this.resolveActorType(raw.beneficiaryIdentityId),\n ]);\n const escrowContract = this.mapOnChainEscrow(raw, receipt.txHash, depositorType, recipientType);\n\n this.events.emit('escrow.created', {\n escrowId: escrowContract.escrowId,\n amount: escrowContract.amount,\n depositor: escrowContract.depositor.address,\n depositorIdentityId: fromBytes32(depositorIdentityId),\n beneficiary: escrowContract.recipient.address,\n beneficiaryIdentityId: fromBytes32(recipientIdentityId),\n conditionType: opts.conditions.type,\n });\n\n // Auto-fund if requested\n if (opts.autoFund) {\n await this.fund(escrowContract.escrowId);\n }\n\n return escrowContract;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Fund an escrow with USDC.\n *\n * This uses a two-step ERC20 approval flow:\n * 1. Approve the escrow contract to spend USDC\n * 2. Call fund() to transfer USDC to the escrow\n *\n * @param escrowId - The escrow to fund\n * @returns Transaction receipt\n */\n async fund(escrowId: string): Promise<TxReceipt> {\n this.telemetry.track('escrow.fund');\n\n try {\n const contract = this.contracts.getContract('escrow');\n const publicClient = this.contracts.getPublicClient();\n const escrowIdBytes = toBytes32(escrowId);\n\n // Read escrow to get amount\n const getEscrowFn = contract.read['getEscrow'];\n if (!getEscrowFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getEscrow function not found on contract');\n const raw = await getEscrowFn([escrowIdBytes]) as OnChainEscrow;\n\n // Step 1: Approve USDC spending\n const usdcContract = this.contracts.getContract('mockUsdc');\n const approveFn = usdcContract.write['approve'];\n if (!approveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'approve function not found on USDC contract');\n const approveTxHash = await approveFn([this.getContractAddress() as `0x${string}`, raw.amount]);\n await waitForReceipt(publicClient, approveTxHash);\n\n // Step 2: Call fund()\n const fundFn = contract.write['fund'];\n if (!fundFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'fund function not found on contract');\n const txHash = await fundFn([escrowIdBytes]);\n const receipt = await waitForReceipt(publicClient, txHash);\n\n this.events.emit('escrow.funded', {\n escrowId,\n funder: this.contracts.getWalletAddress(),\n depositor: raw.depositor,\n depositorIdentityId: fromBytes32(raw.depositorIdentityId),\n beneficiary: raw.beneficiary,\n beneficiaryIdentityId: fromBytes32(raw.beneficiaryIdentityId),\n amount: fromUSDCWei(raw.amount),\n });\n\n return {\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n status: receipt.status,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Release escrow funds to recipient.\n *\n * @param escrowId - The escrow to release\n * @param opts - Optional release options\n * @returns Transaction receipt\n */\n async release(escrowId: string, _opts?: ReleaseOptions): Promise<TxReceipt> {\n this.telemetry.track('escrow.release');\n\n try {\n const contract = this.contracts.getContract('escrow');\n const publicClient = this.contracts.getPublicClient();\n const escrowIdBytes = toBytes32(escrowId);\n\n const releaseFn = contract.write['release'];\n if (!releaseFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'release function not found on contract');\n const txHash = await releaseFn([escrowIdBytes]);\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Read escrow to get party data for enriched event\n const getEscrowForEvent = contract.read['getEscrow'];\n if (getEscrowForEvent) {\n try {\n const rawEscrow = await getEscrowForEvent([escrowIdBytes]) as OnChainEscrow | undefined;\n if (rawEscrow) {\n this.events.emit('escrow.released', {\n escrowId,\n depositor: rawEscrow.depositor,\n depositorIdentityId: fromBytes32(rawEscrow.depositorIdentityId),\n beneficiary: rawEscrow.beneficiary,\n beneficiaryIdentityId: fromBytes32(rawEscrow.beneficiaryIdentityId),\n amount: fromUSDCWei(rawEscrow.amount),\n });\n } else {\n this.events.emit('escrow.released', { escrowId });\n }\n } catch {\n this.events.emit('escrow.released', { escrowId });\n }\n } else {\n this.events.emit('escrow.released', { escrowId });\n }\n\n return {\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n status: receipt.status,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Refund escrow to depositor.\n *\n * @param escrowId - The escrow to refund\n * @returns Transaction receipt\n */\n async refund(escrowId: string): Promise<TxReceipt> {\n this.telemetry.track('escrow.refund');\n\n try {\n const contract = this.contracts.getContract('escrow');\n const publicClient = this.contracts.getPublicClient();\n const escrowIdBytes = toBytes32(escrowId);\n\n const refundFn = contract.write['refund'];\n if (!refundFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'refund function not found on contract');\n const txHash = await refundFn([escrowIdBytes]);\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Emit enriched refund event\n const getEscrowForRefund = contract.read['getEscrow'];\n if (getEscrowForRefund) {\n try {\n const rawEscrow = await getEscrowForRefund([escrowIdBytes]) as OnChainEscrow;\n this.events.emit('escrow.refunded', {\n escrowId,\n depositor: rawEscrow.depositor,\n depositorIdentityId: fromBytes32(rawEscrow.depositorIdentityId),\n beneficiary: rawEscrow.beneficiary,\n beneficiaryIdentityId: fromBytes32(rawEscrow.beneficiaryIdentityId),\n amount: fromUSDCWei(rawEscrow.amount),\n });\n } catch { /* event emission is best-effort */ }\n }\n\n return {\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n status: receipt.status,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Open a dispute on an escrow.\n *\n * @param escrowId - The escrow to dispute\n * @param reason - Reason for the dispute\n * @returns Transaction receipt\n */\n async dispute(escrowId: string, reason: string): Promise<TxReceipt> {\n this.telemetry.track('escrow.dispute');\n\n try {\n const contract = this.contracts.getContract('escrow');\n const publicClient = this.contracts.getPublicClient();\n const escrowIdBytes = toBytes32(escrowId);\n\n const disputeFn = contract.write['dispute'];\n if (!disputeFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'dispute function not found on contract');\n const txHash = await disputeFn([escrowIdBytes, reason]);\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Read escrow for enriched event data\n const getEscrowForDispute = contract.read['getEscrow'];\n if (getEscrowForDispute) {\n try {\n const rawEscrow = await getEscrowForDispute([escrowIdBytes]) as OnChainEscrow;\n this.events.emit('escrow.disputed', {\n escrowId,\n reason,\n disputant: this.contracts.getWalletAddress(),\n depositor: rawEscrow.depositor,\n depositorIdentityId: fromBytes32(rawEscrow.depositorIdentityId),\n beneficiary: rawEscrow.beneficiary,\n beneficiaryIdentityId: fromBytes32(rawEscrow.beneficiaryIdentityId),\n amount: fromUSDCWei(rawEscrow.fundedAmount),\n });\n } catch {\n this.events.emit('escrow.disputed', { escrowId, reason });\n }\n } else {\n this.events.emit('escrow.disputed', { escrowId, reason });\n }\n\n return {\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n status: receipt.status,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Resolve a dispute (arbiter only).\n *\n * Transfers funds to either beneficiary or depositor based on resolution.\n *\n * @param escrowId - The disputed escrow\n * @param opts - Resolution options\n * @returns Transaction receipt\n */\n async resolve(escrowId: string, opts: ResolveOptions): Promise<TxReceipt> {\n this.telemetry.track('escrow.resolve');\n\n try {\n const contract = this.contracts.getContract('escrow');\n const publicClient = this.contracts.getPublicClient();\n const escrowIdBytes = toBytes32(escrowId);\n\n // For now, use simple boolean: releaseToBeneficiary = recipientShare > depositorShare\n const recipientShare = parseFloat(opts.recipientShare);\n const depositorShare = parseFloat(opts.depositorShare);\n const releaseToBeneficiary = recipientShare > depositorShare;\n\n const resolveFn = contract.write['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found on contract');\n const txHash = await resolveFn([escrowIdBytes, 'Dispute resolved', releaseToBeneficiary]);\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Emit enriched resolve event\n const getEscrowForResolve = contract.read['getEscrow'];\n if (getEscrowForResolve) {\n try {\n const rawEscrow = await getEscrowForResolve([escrowIdBytes]) as OnChainEscrow;\n this.events.emit('escrow.resolved', {\n escrowId,\n depositor: rawEscrow.depositor,\n depositorIdentityId: fromBytes32(rawEscrow.depositorIdentityId),\n beneficiary: rawEscrow.beneficiary,\n beneficiaryIdentityId: fromBytes32(rawEscrow.beneficiaryIdentityId),\n transferAmount: fromUSDCWei(rawEscrow.amount),\n releasedToBeneficiary: releaseToBeneficiary,\n });\n } catch { /* event emission is best-effort */ }\n }\n\n return {\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n status: receipt.status,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Approve escrow release (multi-sig signer).\n *\n * Each signer calls this independently. When the threshold is met,\n * funds can be released.\n *\n * @param escrowId - The escrow to approve\n * @returns Approval result with threshold status\n */\n async approve(escrowId: string): Promise<ApprovalResult> {\n this.telemetry.track('escrow.approve');\n\n try {\n const contract = this.contracts.getContract('escrow');\n const publicClient = this.contracts.getPublicClient();\n const escrowIdBytes = toBytes32(escrowId);\n\n const approveReleaseFn = contract.write['approveRelease'];\n if (!approveReleaseFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'approveRelease function not found on contract');\n const txHash = await approveReleaseFn([escrowIdBytes]);\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Parse EscrowApproved event to get approval count and threshold\n let approvalCount = 1;\n let threshold = 2;\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: InvarianceEscrowAbi,\n data: log.data as `0x${string}`,\n topics: log.topics as [`0x${string}`, ...`0x${string}`[]],\n });\n if (decoded.eventName === 'EscrowApproved') {\n const args = decoded.args as { approvalCount: bigint; threshold: bigint };\n approvalCount = Number(args.approvalCount);\n threshold = Number(args.threshold);\n break;\n }\n } catch { continue; }\n }\n\n // Event emission handled by event listeners\n\n return {\n signer: this.contracts.getWalletAddress(),\n txHash: receipt.txHash,\n approvalsReceived: approvalCount,\n thresholdMet: approvalCount >= threshold,\n remaining: Math.max(0, threshold - approvalCount),\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Check multi-sig approval status.\n *\n * @param escrowId - The escrow to check\n * @returns Approval status with signer details\n */\n async approvals(escrowId: string): Promise<ApprovalStatus> {\n this.telemetry.track('escrow.approvals');\n\n try {\n const contract = this.contracts.getContract('escrow');\n const escrowIdBytes = toBytes32(escrowId);\n\n // Read escrow to check if it's multi-sig\n const getEscrowFn = contract.read['getEscrow'];\n if (!getEscrowFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getEscrow function not found on contract');\n const raw = await getEscrowFn([escrowIdBytes]) as OnChainEscrow;\n\n const conditionType = enumToEscrowConditionType(raw.conditionType);\n if (conditionType !== 'multi-sig') {\n throw new InvarianceError(\n ErrorCode.ESCROW_WRONG_STATE,\n 'Escrow is not a multi-sig escrow',\n );\n }\n\n // Decode multi-sig config from conditionData\n let signerAddresses: string[] = [];\n let sigThreshold = 0;\n if (raw.conditionData.length > 2) {\n try {\n const [signers, thresholdVal] = decodeAbiParameters(\n [{ type: 'address[]' }, { type: 'uint256' }, { type: 'uint256' }],\n raw.conditionData,\n );\n signerAddresses = signers as string[];\n sigThreshold = Number(thresholdVal);\n } catch {\n // conditionData malformed, return empty\n }\n }\n\n return {\n escrowId,\n threshold: sigThreshold,\n received: 0,\n signers: signerAddresses.map(addr => ({\n address: addr,\n approved: false,\n })),\n thresholdMet: false,\n autoReleased: false,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Get the current state of an escrow.\n *\n * @param escrowId - The escrow to check\n * @returns Extended escrow status with time remaining and approvals\n */\n async status(escrowId: string): Promise<EscrowStatus> {\n this.telemetry.track('escrow.status');\n\n try {\n const contract = this.contracts.getContract('escrow');\n const escrowIdBytes = toBytes32(escrowId);\n\n const getEscrowFn = contract.read['getEscrow'];\n if (!getEscrowFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getEscrow function not found on contract');\n const raw = await getEscrowFn([escrowIdBytes]) as OnChainEscrow;\n\n const [depositorType, recipientType] = await Promise.all([\n this.resolveActorType(raw.depositorIdentityId),\n this.resolveActorType(raw.beneficiaryIdentityId),\n ]);\n const escrowContract = this.mapOnChainEscrow(raw, undefined, depositorType, recipientType);\n\n // Calculate time remaining\n const now = Math.floor(Date.now() / 1000);\n const expiresAt = Number(raw.expiresAt);\n const timeRemaining = expiresAt > 0 && expiresAt > now ? expiresAt - now : null;\n\n // Check for dispute\n const onChainState = escrowStateFromEnum(raw.state);\n const disputeReason = onChainState === 'disputed' ? await (async () => {\n const getDisputeFn = contract.read['getDispute'];\n if (getDisputeFn) {\n const dispute = await getDisputeFn([escrowIdBytes]) as { reason: string };\n return dispute.reason;\n }\n return undefined;\n })() : undefined;\n\n // Get approvals if multi-sig\n const conditionType = enumToEscrowConditionType(raw.conditionType);\n const approvals = conditionType === 'multi-sig' ? await this.approvals(escrowId) : undefined;\n\n const result: EscrowStatus = {\n ...escrowContract,\n timeRemaining,\n };\n\n if (disputeReason !== undefined) {\n result.disputeReason = disputeReason;\n }\n\n if (approvals !== undefined) {\n result.approvals = approvals;\n }\n\n return result;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * List escrows by identity, state, or role.\n *\n * Attempts the indexer API first, falls back to on-chain reads.\n *\n * @param filters - Optional filters\n * @returns Array of matching escrow contracts\n */\n async list(filters?: EscrowListFilters): Promise<EscrowContract[]> {\n this.telemetry.track('escrow.list', { hasFilters: filters !== undefined });\n\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (available) {\n try {\n const pageSize = Math.max(1, filters?.limit ?? 20);\n const offset = Math.max(0, filters?.offset ?? 0);\n const page = Math.floor(offset / pageSize) + 1;\n const params: Record<string, string | number | undefined> = {\n depositor: filters?.depositor,\n recipient: filters?.recipient,\n state: filters?.state,\n page,\n pageSize,\n };\n const rows = await indexer.get<Record<string, unknown>[]>('/escrows', params);\n const explorerBase = this.contracts.getExplorerBaseUrl();\n return rows.map((row) => mapEscrowRow(row, explorerBase));\n } catch (err) {\n this.telemetry.track('escrow.list.error', { error: String(err) });\n }\n }\n\n // On-chain fallback: read escrowCount and iterate (limited)\n try {\n const contract = this.contracts.getContract('escrow');\n const countFn = contract.read['escrowCount'];\n if (!countFn) return [];\n const count = await countFn([]) as bigint;\n const _limit = Math.min(Number(count), filters?.limit ?? 50);\n\n // On-chain sequential reads are expensive, cap at limit\n // NOTE: On-chain fallback is limited and cannot filter efficiently.\n // In production, the indexer should always be available.\n void _limit;\n return [];\n } catch (err) {\n this.telemetry.track('escrow.list.fallback.error', { error: String(err) });\n return [];\n }\n }\n\n /**\n * Subscribe to escrow state changes in real-time.\n *\n * @param escrowId - The escrow to monitor\n * @param callback - Called when the escrow state changes\n * @returns Unsubscribe function\n */\n onStateChange(escrowId: string, callback: EscrowStateChangeCallback): Unsubscribe {\n this.telemetry.track('escrow.onStateChange');\n\n const publicClient = this.contracts.getPublicClient();\n const escrowIdBytes = toBytes32(escrowId);\n\n let lastKnownState: EscrowState = 'created';\n\n const stateMap: Record<string, EscrowState> = {\n EscrowFunded: 'funded',\n EscrowReleased: 'released',\n EscrowRefunded: 'refunded',\n EscrowDisputed: 'disputed',\n EscrowResolved: 'released',\n };\n\n const unwatch = publicClient.watchContractEvent({\n abi: InvarianceEscrowAbi,\n args: { escrowId: escrowIdBytes },\n onLogs: (logs: readonly { data: `0x${string}`; topics: readonly `0x${string}`[]; transactionHash?: string }[]) => {\n for (const log of logs) {\n try {\n const decoded = decodeEventLog({\n abi: InvarianceEscrowAbi,\n data: log.data,\n topics: log.topics as [`0x${string}`, ...`0x${string}`[]],\n });\n const newState = stateMap[decoded.eventName];\n if (newState) {\n callback({\n escrowId,\n previousState: lastKnownState,\n newState,\n txHash: log.transactionHash ?? '',\n timestamp: Date.now(),\n });\n lastKnownState = newState;\n }\n } catch { continue; }\n }\n },\n });\n\n return unwatch;\n }\n}\n","/**\n * Semantic analytics helpers for common ledger query patterns.\n *\n * @example\n * ```typescript\n * const rate = await inv.ledger.analytics.successRate('0xBot', { from: '2025-01-01' });\n * const costs = await inv.ledger.analytics.costSummary('0xBot', { from: '2025-01-01' });\n * ```\n */\nimport type { EventLedger } from './EventLedger.js';\nimport type { LedgerQueryFilters } from './types.js';\nimport type {\n AnalyticsTimeframe,\n SuccessRateResult,\n ActionCountResult,\n CostSummaryResult,\n ViolationResult,\n} from './types.js';\n\n/** Build query filters, only including defined timeframe fields */\nfunction buildFilters(\n base: LedgerQueryFilters,\n timeframe?: AnalyticsTimeframe,\n): LedgerQueryFilters {\n const filters: LedgerQueryFilters = { ...base, limit: 10000 };\n if (timeframe?.from !== undefined) filters.from = timeframe.from;\n if (timeframe?.to !== undefined) filters.to = timeframe.to;\n return filters;\n}\n\n/**\n * Analytics layer on top of the Event Ledger.\n */\nexport class LedgerAnalytics {\n constructor(private readonly ledger: EventLedger) {}\n\n /**\n * Calculate the success rate for an actor's actions.\n *\n * @param actor - Actor address\n * @param timeframe - Optional time range filter\n * @returns Success rate as a ratio and percentage\n */\n async successRate(actor: string, timeframe?: AnalyticsTimeframe): Promise<SuccessRateResult> {\n const entries = await this.ledger.query(buildFilters({ actor }, timeframe));\n\n const total = entries.length;\n const successful = entries.filter((e) => {\n const status = (e.metadata as Record<string, unknown> | undefined)?.['status'];\n return status !== 'failed' && status !== 'rejected' && status !== 'violation';\n }).length;\n\n return {\n total,\n successful,\n failed: total - successful,\n rate: total > 0 ? successful / total : 0,\n percentage: total > 0 ? Math.round((successful / total) * 10000) / 100 : 0,\n };\n }\n\n /**\n * Count occurrences of a specific action for an actor.\n *\n * @param actor - Actor address\n * @param action - Action name to count\n * @param timeframe - Optional time range filter\n * @returns Count and breakdown by category\n */\n async actionCount(actor: string, action: string, timeframe?: AnalyticsTimeframe): Promise<ActionCountResult> {\n const entries = await this.ledger.query(buildFilters({ actor, action }, timeframe));\n\n const byCategory: Record<string, number> = {};\n for (const entry of entries) {\n const cat = entry.category ?? 'custom';\n byCategory[cat] = (byCategory[cat] ?? 0) + 1;\n }\n\n return {\n action,\n count: entries.length,\n byCategory,\n };\n }\n\n /**\n * Summarize costs/spending for an actor.\n *\n * @param actor - Actor address\n * @param timeframe - Optional time range filter\n * @returns Cost breakdown by action\n */\n async costSummary(actor: string, timeframe?: AnalyticsTimeframe): Promise<CostSummaryResult> {\n const entries = await this.ledger.query(buildFilters({ actor }, timeframe));\n\n let totalCost = 0;\n const byAction: Record<string, number> = {};\n\n for (const entry of entries) {\n const meta = entry.metadata as Record<string, unknown> | undefined;\n const cost = Number(meta?.['cost'] ?? meta?.['amount'] ?? meta?.['gasUsed'] ?? 0);\n totalCost += cost;\n byAction[entry.action] = (byAction[entry.action] ?? 0) + cost;\n }\n\n return {\n totalCost: totalCost.toString(),\n transactionCount: entries.length,\n byAction,\n };\n }\n\n /**\n * Query policy violations for an actor.\n *\n * @param actor - Actor address\n * @param timeframe - Optional time range filter\n * @returns List of violations with details\n */\n async violations(actor: string, timeframe?: AnalyticsTimeframe): Promise<ViolationResult> {\n const entries = await this.ledger.query(buildFilters({ actor, category: 'violation' }, timeframe));\n\n const byAction: Record<string, number> = {};\n const details = entries.map((entry) => {\n byAction[entry.action] = (byAction[entry.action] ?? 0) + 1;\n const meta = entry.metadata as Record<string, unknown> | undefined;\n return {\n action: entry.action,\n timestamp: entry.timestamp,\n detail: (meta?.['detail'] as string | undefined) ?? '',\n policyId: (meta?.['policyId'] as string | undefined) ?? '',\n };\n });\n\n return {\n total: entries.length,\n byAction,\n details,\n };\n }\n}\n","import type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport { ErrorCode } from '@invariance/common';\nimport type { Unsubscribe } from '@invariance/common';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport { IndexerClient } from '../../utils/indexer-client.js';\nimport { mapLedgerRow } from '../../utils/indexer-mappers.js';\nimport {\n toBytes32,\n fromBytes32,\n waitForReceipt,\n mapContractError,\n parseEntryIdFromLogs,\n hashMetadata,\n mapSeverity,\n generateActorSignature,\n generatePlatformAttestation,\n convertToCSV,\n actorTypeToEnum,\n} from '../../utils/contract-helpers.js';\nimport type {\n LedgerEventInput,\n LedgerEntry,\n LedgerQueryFilters,\n ExportData,\n LedgerStreamCallback,\n} from './types.js';\nimport { LedgerAnalytics } from './LedgerAnalytics.js';\n\n/** On-chain LogInput struct */\ninterface OnChainLogInput {\n actorIdentityId: `0x${string}`;\n actorType: number;\n actorAddress: string;\n action: string;\n category: string;\n metadataHash: `0x${string}`;\n proofHash: `0x${string}`;\n actorSignature: string;\n platformSignature: string;\n severity: number;\n}\n\n/**\n * Immutable on-chain logging with dual signatures.\n *\n * The Event Ledger is the single source of truth for all Invariance actions.\n * Every intent, every escrow state change, every policy evaluation is logged\n * here with dual signatures. This is a Truth Ledger that produces identical\n * proof records regardless of actor type.\n *\n * @example\n * ```typescript\n * const entry = await inv.ledger.log({\n * action: 'model-inference',\n * actor: { type: 'agent', address: '0xMyAgent' },\n * metadata: { model: 'claude-sonnet', latencyMs: 230 },\n * });\n * console.log(entry.explorerUrl);\n * ```\n */\nexport class EventLedger {\n private readonly contracts: ContractFactory;\n private readonly events: InvarianceEventEmitter;\n private readonly telemetry: Telemetry;\n private indexer: IndexerClient | null = null;\n private _analytics?: LedgerAnalytics;\n\n constructor(\n contracts: ContractFactory,\n events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ) {\n this.contracts = contracts;\n this.events = events;\n this.telemetry = telemetry;\n }\n\n /**\n * Analytics helpers for common ledger query patterns.\n *\n * @example\n * ```typescript\n * const rate = await inv.ledger.analytics.successRate('0xBot');\n * ```\n */\n get analytics(): LedgerAnalytics {\n if (!this._analytics) {\n this._analytics = new LedgerAnalytics(this);\n }\n return this._analytics;\n }\n\n /** Lazily initialize the indexer client */\n private getIndexer(): IndexerClient {\n if (!this.indexer) {\n this.indexer = new IndexerClient(this.contracts.getApiBaseUrl(), this.contracts.getApiKey());\n }\n return this.indexer;\n }\n\n /** Get the contract address for the ledger module */\n getContractAddress(): string {\n return this.contracts.getAddress('ledger');\n }\n\n /**\n * Log a custom event on-chain.\n *\n * Creates an immutable ledger entry with dual signatures (actor + platform),\n * metadata hash, and a public explorer URL.\n *\n * @param event - The event to log\n * @returns The created ledger entry with proof bundle\n */\n async log(event: LedgerEventInput): Promise<LedgerEntry> {\n this.telemetry.track('ledger.log', {\n action: event.action,\n category: event.category ?? 'custom',\n });\n\n try {\n const contract = this.contracts.getContract('ledger');\n const identityContract = this.contracts.getContract('identity');\n\n // Resolve actor identity ID\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n const identityId = await resolveFn([event.actor.address as `0x${string}`]) as `0x${string}`;\n\n // Hash metadata\n const metadata = event.metadata ?? {};\n const metadataHash = hashMetadata(metadata);\n\n // Generate dual signatures\n const walletClient = this.contracts.getWalletClient();\n const actorSig = await generateActorSignature({ action: event.action, metadata }, walletClient);\n const platformSig = await generatePlatformAttestation(\n { action: event.action, metadata },\n this.contracts.getApiKey(),\n this.contracts.getApiBaseUrl(),\n );\n\n // Prepare LogInput\n const logInput: OnChainLogInput = {\n actorIdentityId: identityId,\n actorType: actorTypeToEnum(event.actor.type),\n actorAddress: event.actor.address,\n action: event.action,\n category: event.category ?? 'custom',\n metadataHash,\n proofHash: metadataHash,\n actorSignature: actorSig,\n platformSignature: platformSig,\n severity: mapSeverity(event.severity ?? 'info'),\n };\n\n // Call contract\n const logFn = contract.write['log'];\n if (!logFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'log function not found');\n const txHash = await logFn([logInput]);\n\n const optimistic = this.contracts.getConfirmation() === 'optimistic';\n const receiptClient = this.contracts.getReceiptClient();\n const receipt = await waitForReceipt(receiptClient, txHash, { optimistic });\n const entryId = optimistic\n ? toBytes32(txHash)\n : parseEntryIdFromLogs(receipt.logs);\n\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const result: LedgerEntry = {\n entryId: fromBytes32(entryId),\n action: event.action,\n actor: event.actor,\n category: event.category ?? 'custom',\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n timestamp: Date.now(),\n proof: {\n proofHash: metadataHash,\n signatures: {\n actor: actorSig,\n platform: platformSig,\n valid: true,\n },\n metadataHash,\n verifiable: true,\n raw: JSON.stringify({ entryId: fromBytes32(entryId), txHash: receipt.txHash }),\n },\n metadataHash,\n ...(event.metadata !== undefined && { metadata: event.metadata }),\n explorerUrl: `${explorerBase}/tx/${receipt.txHash}`,\n };\n\n this.events.emit('ledger.logged', {\n entryId: result.entryId,\n action: event.action,\n });\n\n return result;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Log multiple events in a single transaction.\n *\n * More gas-efficient than individual log() calls when\n * logging multiple related events.\n *\n * @param events - Array of events to log\n * @returns Array of created ledger entries\n */\n async batch(events: LedgerEventInput[]): Promise<LedgerEntry[]> {\n this.telemetry.track('ledger.batch', { count: events.length });\n\n try {\n const contract = this.contracts.getContract('ledger');\n const identityContract = this.contracts.getContract('identity');\n\n // Prepare all log inputs\n const logInputs: OnChainLogInput[] = [];\n const walletClient = this.contracts.getWalletClient();\n\n for (const event of events) {\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n const identityId = await resolveFn([event.actor.address as `0x${string}`]) as `0x${string}`;\n\n const metadata = event.metadata ?? {};\n const metadataHash = hashMetadata(metadata);\n const actorSig = await generateActorSignature({ action: event.action, metadata }, walletClient);\n const platformSig = await generatePlatformAttestation(\n { action: event.action, metadata },\n this.contracts.getApiKey(),\n this.contracts.getApiBaseUrl(),\n );\n\n logInputs.push({\n actorIdentityId: identityId,\n actorType: actorTypeToEnum(event.actor.type),\n actorAddress: event.actor.address,\n action: event.action,\n category: event.category ?? 'custom',\n metadataHash,\n proofHash: metadataHash,\n actorSignature: actorSig,\n platformSignature: platformSig,\n severity: mapSeverity(event.severity ?? 'info'),\n });\n }\n\n // Submit batch\n const logBatchFn = contract.write['logBatch'];\n if (!logBatchFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'logBatch function not found');\n const txHash = await logBatchFn([logInputs]);\n\n const optimistic = this.contracts.getConfirmation() === 'optimistic';\n const receiptClient = this.contracts.getReceiptClient();\n const receipt = await waitForReceipt(receiptClient, txHash, { optimistic });\n\n // Parse real entry IDs from contract logs (BatchLogged/EntryLogged events)\n const parsedEntryIds: string[] = [];\n if (!optimistic) {\n for (const log of receipt.logs) {\n if (log.topics[1]) {\n parsedEntryIds.push(fromBytes32(log.topics[1] as `0x${string}`));\n }\n }\n }\n\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const results: LedgerEntry[] = events.map((event, i) => {\n const baseEntry: LedgerEntry = {\n entryId: parsedEntryIds[i] ?? `batch_${i}_${Date.now()}`,\n action: event.action,\n actor: event.actor,\n category: event.category ?? 'custom',\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n timestamp: Date.now(),\n proof: {\n proofHash: logInputs[i]!.metadataHash,\n signatures: {\n actor: logInputs[i]!.actorSignature,\n platform: logInputs[i]!.platformSignature,\n valid: true,\n },\n metadataHash: logInputs[i]!.metadataHash,\n verifiable: true,\n raw: JSON.stringify({ txHash: receipt.txHash }),\n },\n metadataHash: logInputs[i]!.metadataHash,\n explorerUrl: `${explorerBase}/tx/${receipt.txHash}`,\n };\n if (event.metadata !== undefined) {\n return { ...baseEntry, metadata: event.metadata };\n }\n return baseEntry;\n });\n\n return results;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Query ledger entries by identity, action, or time range.\n *\n * @param filters - Query filters (actor, action, category, time range)\n * @returns Array of matching ledger entries\n */\n async query(filters: LedgerQueryFilters): Promise<LedgerEntry[]> {\n this.telemetry.track('ledger.query', { hasFilters: true });\n\n try {\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (!available) {\n return [];\n }\n\n const pageSize = Math.max(1, filters.limit ?? 100);\n const offset = Math.max(0, filters.offset ?? 0);\n const page = Math.floor(offset / pageSize) + 1;\n const params: Record<string, string | number | undefined> = {\n actorAddress: filters.actor,\n action: Array.isArray(filters.action) ? filters.action.join(',') : filters.action,\n category: filters.category,\n from: typeof filters.from === 'string' ? filters.from : filters.from?.toString(),\n to: typeof filters.to === 'string' ? filters.to : filters.to?.toString(),\n page,\n pageSize,\n };\n\n const rows = await indexer.get<Record<string, unknown>[]>('/ledger', params);\n const explorerBase = this.contracts.getExplorerBaseUrl();\n return rows.map((row) => mapLedgerRow(row, explorerBase));\n } catch {\n return [];\n }\n }\n\n /**\n * Stream ledger entries in real-time.\n *\n * Subscribes to new ledger entries matching the given filters\n * and invokes the callback for each new entry.\n *\n * @param filters - Optional filters for the stream\n * @param callback - Called for each new matching entry\n * @returns Unsubscribe function\n */\n stream(filters: LedgerQueryFilters, callback: LedgerStreamCallback): Unsubscribe {\n this.telemetry.track('ledger.stream');\n\n try {\n const contract = this.contracts.getContract('ledger');\n const publicClient = this.contracts.getPublicClient();\n\n // Subscribe to EntryLogged events\n const unwatch = publicClient.watchContractEvent({\n address: contract.address as `0x${string}`,\n abi: contract.abi,\n eventName: 'EntryLogged',\n onLogs: (logs) => {\n for (const log of logs) {\n // Filter based on criteria and call callback\n const args = (log as { args?: { action?: string; actorAddress?: string } }).args;\n if (!args) continue;\n\n if (filters.action && args.action !== filters.action) continue;\n if (filters.actor && args.actorAddress !== filters.actor) continue;\n\n // Construct minimal entry for callback\n const entry: LedgerEntry = {\n entryId: log.topics[1] as string ?? '',\n action: args.action ?? '',\n actor: { type: 'agent', address: args.actorAddress ?? '' },\n category: 'custom',\n txHash: log.transactionHash ?? '',\n blockNumber: Number(log.blockNumber ?? 0),\n timestamp: Date.now(),\n proof: {\n proofHash: '',\n signatures: { actor: '', valid: true },\n metadataHash: '',\n verifiable: true,\n raw: '',\n },\n metadataHash: '',\n explorerUrl: '',\n };\n\n callback(entry);\n }\n },\n });\n\n return unwatch;\n } catch (err) {\n this.telemetry.track('ledger.stream.error', { error: String(err) });\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Export ledger entries as JSON or CSV.\n *\n * @param filters - Query filters to select entries for export\n * @returns Exported data in the requested format\n */\n async export(filters: LedgerQueryFilters): Promise<ExportData> {\n this.telemetry.track('ledger.export');\n\n try {\n const entries = await this.query({ ...filters, limit: 10000 });\n const format = (filters as { format?: 'json' | 'csv' }).format ?? 'json';\n\n if (format === 'csv') {\n const csvData = convertToCSV(entries);\n return {\n format: 'csv',\n data: csvData,\n count: entries.length,\n exportedAt: Date.now(),\n };\n }\n\n return {\n format: 'json',\n data: JSON.stringify(entries, null, 2),\n count: entries.length,\n exportedAt: Date.now(),\n };\n } catch {\n return {\n format: 'json',\n data: '[]',\n count: 0,\n exportedAt: Date.now(),\n };\n }\n }\n}\n","import type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport {\n toBytes32,\n fromBytes32,\n waitForReceipt,\n mapContractError,\n parseCompactEntryIdFromLogs,\n hashMetadata,\n mapSeverity,\n generateActorSignatureEIP712,\n generatePlatformAttestationEIP712,\n} from '../../utils/contract-helpers.js';\nimport type {\n LedgerEventInput,\n LedgerEntry,\n} from './types.js';\n\n/** Compact on-chain LogInput struct (no actorType, no signatures in struct) */\ninterface CompactLogInput {\n actorIdentityId: `0x${string}`;\n actorAddress: string;\n action: string;\n category: string;\n metadataHash: `0x${string}`;\n proofHash: `0x${string}`;\n severity: number;\n}\n\n/**\n * Fraud-proof on-chain logging via CompactLedger with EIP-712 dual signatures.\n *\n * Unlike the legacy {@link EventLedger}, this module calls `CompactLedger.log(input, actorSig, platformSig)`\n * where both signatures are verified on-chain via `ECDSA.recover`. This means:\n * - Actor signature uses EIP-712 `signTypedData` (not `signMessage`)\n * - Platform signature comes from `/v1/attest` API (API key required)\n * - The keccak256 fallback is NOT valid — it will revert on-chain\n *\n * @example\n * ```typescript\n * // Requires API key for platform attestation\n * const inv = new Invariance({\n * chain: 'base-sepolia',\n * signer: wallet,\n * apiKey: 'inv_live_xxx',\n * });\n *\n * const entry = await inv.ledgerCompact.log({\n * action: 'model-inference',\n * actor: { type: 'agent', address: '0xMyAgent' },\n * metadata: { model: 'claude-sonnet', latencyMs: 230 },\n * });\n * ```\n */\nexport class EventLedgerCompact {\n private readonly contracts: ContractFactory;\n private readonly events: InvarianceEventEmitter;\n private readonly telemetry: Telemetry;\n\n constructor(\n contracts: ContractFactory,\n events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ) {\n this.contracts = contracts;\n this.events = events;\n this.telemetry = telemetry;\n }\n\n /** Get the contract address for the compact ledger module */\n getContractAddress(): string {\n return this.contracts.getAddress('compactLedger');\n }\n\n /**\n * Log a fraud-proof event on-chain via CompactLedger.\n *\n * Creates an immutable ledger entry with EIP-712 dual signatures (actor + platform)\n * that are verified on-chain. Requires an API key for platform attestation.\n *\n * @param event - The event to log\n * @returns The created ledger entry with proof bundle\n * @throws {InvarianceError} If no API key is configured\n */\n async log(event: LedgerEventInput): Promise<LedgerEntry> {\n this.telemetry.track('ledgerCompact.log', {\n action: event.action,\n category: event.category ?? 'custom',\n });\n\n try {\n const compactLedger = this.contracts.getContract('compactLedger');\n const identityContract = this.contracts.getContract('identity');\n\n // Resolve actor identity ID\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n const identityId = await resolveFn([event.actor.address as `0x${string}`]) as `0x${string}`;\n\n // Hash metadata\n const metadata = event.metadata ?? {};\n const metadataHash = hashMetadata(metadata);\n\n // Build compact input struct\n const compactInput: CompactLogInput = {\n actorIdentityId: identityId,\n actorAddress: event.actor.address,\n action: event.action,\n category: event.category ?? 'custom',\n metadataHash,\n proofHash: metadataHash,\n severity: mapSeverity(event.severity ?? 'info'),\n };\n\n // Generate EIP-712 dual signatures\n const domain = this.contracts.getCompactLedgerDomain();\n const walletClient = this.contracts.getWalletClient();\n\n const actorSig = await generateActorSignatureEIP712(compactInput, domain, walletClient);\n const platformSig = await generatePlatformAttestationEIP712(\n compactInput,\n this.contracts.getApiKey(),\n this.contracts.getApiBaseUrl(),\n );\n\n // Call CompactLedger.log(input, actorSig, platformSig)\n const logFn = compactLedger.write['log'];\n if (!logFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'log function not found on CompactLedger');\n const txHash = await logFn([compactInput, actorSig, platformSig]);\n\n const optimistic = this.contracts.getConfirmation() === 'optimistic';\n const receiptClient = this.contracts.getReceiptClient();\n const receipt = await waitForReceipt(receiptClient, txHash, { optimistic });\n const entryId = optimistic\n ? toBytes32(txHash)\n : parseCompactEntryIdFromLogs(receipt.logs);\n\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const result: LedgerEntry = {\n entryId: fromBytes32(entryId),\n action: event.action,\n actor: event.actor,\n category: event.category ?? 'custom',\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n timestamp: Date.now(),\n proof: {\n proofHash: metadataHash,\n signatures: {\n actor: actorSig,\n platform: platformSig,\n valid: true,\n },\n metadataHash,\n verifiable: true,\n raw: JSON.stringify({ entryId: fromBytes32(entryId), txHash: receipt.txHash, mode: 'compact' }),\n },\n metadataHash,\n ...(event.metadata !== undefined && { metadata: event.metadata }),\n explorerUrl: `${explorerBase}/tx/${receipt.txHash}`,\n };\n\n this.events.emit('ledger.logged', {\n entryId: result.entryId,\n action: event.action,\n });\n\n return result;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n}\n","import type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport {\n toBytes32,\n fromBytes32,\n waitForReceipt,\n mapContractError,\n hashMetadata,\n mapSeverity,\n generateActorSignatureEIP712,\n generatePlatformAttestationEIP712,\n} from '../../utils/contract-helpers.js';\nimport type {\n LedgerEventInput,\n LedgerEntry,\n AutoBatchConfig,\n} from './types.js';\n\n/** Compact on-chain LogInput struct */\ninterface CompactLogInput {\n actorIdentityId: `0x${string}`;\n actorAddress: string;\n action: string;\n category: string;\n metadataHash: `0x${string}`;\n proofHash: `0x${string}`;\n severity: number;\n}\n\n/** Buffered entry awaiting batch flush */\ninterface BufferedEntry {\n event: LedgerEventInput;\n compactInput: CompactLogInput;\n actorSig: `0x${string}`;\n platformSig: `0x${string}`;\n metadataHash: `0x${string}`;\n resolve: (entry: LedgerEntry) => void;\n reject: (err: Error) => void;\n addedAt: number;\n}\n\n/**\n * Auto-batching wrapper around CompactLedger that buffers `log()` calls\n * and flushes them as a single `logBatch()` transaction.\n *\n * @example\n * ```typescript\n * const batched = inv.ledgerCompactBatched({ maxBatchSize: 10, maxWaitMs: 5000 });\n * // These 10 calls produce 1 on-chain transaction:\n * await Promise.all(Array.from({ length: 10 }, (_, i) =>\n * batched.log({ action: `action-${i}`, actor: { type: 'agent', address: '0x...' } })\n * ));\n * ```\n */\nexport class AutoBatchedEventLedgerCompact {\n private readonly contracts: ContractFactory;\n private readonly events: InvarianceEventEmitter;\n private readonly telemetry: Telemetry;\n private readonly maxBatchSize: number;\n private readonly maxWaitMs: number;\n private readonly enabled: boolean;\n\n private buffer: BufferedEntry[] = [];\n private timer: ReturnType<typeof setTimeout> | null = null;\n private destroyed = false;\n private flushing = false;\n\n constructor(\n contracts: ContractFactory,\n events: InvarianceEventEmitter,\n telemetry: Telemetry,\n config?: AutoBatchConfig,\n ) {\n this.contracts = contracts;\n this.events = events;\n this.telemetry = telemetry;\n this.maxBatchSize = config?.maxBatchSize ?? 10;\n this.maxWaitMs = config?.maxWaitMs ?? 5000;\n this.enabled = config?.enabled ?? true;\n }\n\n /**\n * Log an event. If batching is enabled, the call is buffered and resolved\n * when the batch is flushed. If disabled, delegates directly to the single-entry path.\n */\n async log(event: LedgerEventInput): Promise<LedgerEntry> {\n if (this.destroyed) {\n throw new InvarianceError(ErrorCode.INVALID_INPUT, 'AutoBatchedEventLedgerCompact has been destroyed');\n }\n\n if (!this.enabled) {\n return this._logSingle(event);\n }\n\n // Prepare input + signatures eagerly so errors surface at call time\n const prepared = await this._prepare(event);\n\n return new Promise<LedgerEntry>((resolve, reject) => {\n this.buffer.push({ ...prepared, resolve, reject });\n\n if (this.buffer.length >= this.maxBatchSize) {\n this._scheduleFlush(0);\n } else if (!this.timer) {\n this._scheduleFlush(this.maxWaitMs);\n }\n });\n }\n\n /** Manually flush all buffered entries immediately */\n async flush(): Promise<void> {\n this._clearTimer();\n await this._flush();\n }\n\n /** Flush remaining buffer and prevent future calls */\n async destroy(): Promise<void> {\n this.destroyed = true;\n this._clearTimer();\n if (this.buffer.length > 0) {\n await this._flush();\n }\n }\n\n /** Get the current number of buffered entries */\n getBufferSize(): number {\n return this.buffer.length;\n }\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private async _prepare(event: LedgerEventInput): Promise<Omit<BufferedEntry, 'resolve' | 'reject'>> {\n const identityContract = this.contracts.getContract('identity');\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n const identityId = await resolveFn([event.actor.address as `0x${string}`]) as `0x${string}`;\n\n const metadata = event.metadata ?? {};\n const metadataHash = hashMetadata(metadata);\n\n const compactInput: CompactLogInput = {\n actorIdentityId: identityId,\n actorAddress: event.actor.address,\n action: event.action,\n category: event.category ?? 'custom',\n metadataHash,\n proofHash: metadataHash,\n severity: mapSeverity(event.severity ?? 'info'),\n };\n\n const domain = this.contracts.getCompactLedgerDomain();\n const walletClient = this.contracts.getWalletClient();\n\n const actorSig = await generateActorSignatureEIP712(compactInput, domain, walletClient);\n const platformSig = await generatePlatformAttestationEIP712(\n compactInput,\n this.contracts.getApiKey(),\n this.contracts.getApiBaseUrl(),\n );\n\n return { event, compactInput, actorSig, platformSig, metadataHash, addedAt: Date.now() };\n }\n\n private _scheduleFlush(delayMs: number): void {\n this._clearTimer();\n this.timer = setTimeout(() => {\n this.timer = null;\n this._flush().catch(() => {\n // Errors are already propagated to individual promise rejections\n });\n }, delayMs);\n }\n\n private _clearTimer(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n private async _flush(): Promise<void> {\n if (this.buffer.length === 0 || this.flushing) return;\n this.flushing = true;\n\n // Drain buffer\n const batch = this.buffer.splice(0);\n\n this.telemetry.track('ledgerCompact.logBatch', { count: batch.length });\n\n try {\n const compactLedger = this.contracts.getContract('compactLedger');\n\n const inputs = batch.map((b) => b.compactInput);\n const actorSigs = batch.map((b) => b.actorSig);\n const platformSigs = batch.map((b) => b.platformSig);\n\n const logBatchFn = compactLedger.write['logBatch'];\n if (!logBatchFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'logBatch function not found on CompactLedger');\n const txHash = await logBatchFn([inputs, actorSigs, platformSigs]);\n\n const optimistic = this.contracts.getConfirmation() === 'optimistic';\n const receiptClient = this.contracts.getReceiptClient();\n const receipt = await waitForReceipt(receiptClient, txHash, { optimistic });\n\n const explorerBase = this.contracts.getExplorerBaseUrl();\n\n for (let i = 0; i < batch.length; i++) {\n const b = batch[i]!;\n // For batches, derive a synthetic entryId from txHash + index\n const entryId = optimistic\n ? toBytes32(`${txHash}-${i}`)\n : toBytes32(`${receipt.txHash}-${i}`);\n\n const result: LedgerEntry = {\n entryId: fromBytes32(entryId),\n action: b.event.action,\n actor: b.event.actor,\n category: b.event.category ?? 'custom',\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n timestamp: Date.now(),\n proof: {\n proofHash: b.metadataHash,\n signatures: {\n actor: b.actorSig,\n platform: b.platformSig,\n valid: true,\n },\n metadataHash: b.metadataHash,\n verifiable: true,\n raw: JSON.stringify({ entryId: fromBytes32(entryId), txHash: receipt.txHash, mode: 'compact-batch', batchIndex: i }),\n },\n metadataHash: b.metadataHash,\n ...(b.event.metadata !== undefined && { metadata: b.event.metadata }),\n explorerUrl: `${explorerBase}/tx/${receipt.txHash}`,\n };\n\n this.events.emit('ledger.logged', {\n entryId: result.entryId,\n action: b.event.action,\n });\n\n b.resolve(result);\n }\n } catch (err) {\n const mapped = mapContractError(err);\n for (const b of batch) {\n b.reject(mapped);\n }\n } finally {\n this.flushing = false;\n }\n }\n\n /** Bypass batching — direct single-entry log */\n private async _logSingle(event: LedgerEventInput): Promise<LedgerEntry> {\n const prepared = await this._prepare(event);\n const compactLedger = this.contracts.getContract('compactLedger');\n\n const logFn = compactLedger.write['log'];\n if (!logFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'log function not found on CompactLedger');\n const txHash = await logFn([prepared.compactInput, prepared.actorSig, prepared.platformSig]);\n\n const optimistic = this.contracts.getConfirmation() === 'optimistic';\n const receiptClient = this.contracts.getReceiptClient();\n const receipt = await waitForReceipt(receiptClient, txHash, { optimistic });\n\n const { parseCompactEntryIdFromLogs } = await import('../../utils/contract-helpers.js');\n const entryId = optimistic\n ? toBytes32(txHash)\n : parseCompactEntryIdFromLogs(receipt.logs);\n\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const result: LedgerEntry = {\n entryId: fromBytes32(entryId),\n action: event.action,\n actor: event.actor,\n category: event.category ?? 'custom',\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n timestamp: Date.now(),\n proof: {\n proofHash: prepared.metadataHash,\n signatures: {\n actor: prepared.actorSig,\n platform: prepared.platformSig,\n valid: true,\n },\n metadataHash: prepared.metadataHash,\n verifiable: true,\n raw: JSON.stringify({ entryId: fromBytes32(entryId), txHash: receipt.txHash, mode: 'compact' }),\n },\n metadataHash: prepared.metadataHash,\n ...(event.metadata !== undefined && { metadata: event.metadata }),\n explorerUrl: `${explorerBase}/tx/${receipt.txHash}`,\n };\n\n this.events.emit('ledger.logged', {\n entryId: result.entryId,\n action: event.action,\n });\n\n return result;\n }\n}\n","import type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport { IndexerClient } from '../../utils/indexer-client.js';\nimport type { EscrowState } from '@invariance/common';\nimport { decodeEventLog } from 'viem';\nimport { InvarianceLedgerAbi, InvarianceIntentAbi, InvarianceCompactLedgerAbi, InvarianceAtomicVerifierAbi } from '../../contracts/abis/index.js';\nimport {\n toBytes32,\n fromBytes32,\n mapContractError,\n enumToActorType,\n} from '../../utils/contract-helpers.js';\nimport { fromUSDCWei } from '../../utils/usdc.js';\nimport type {\n VerificationResult,\n IdentityVerification,\n EscrowVerification,\n ProofData,\n VerifyActionOptions,\n} from './types.js';\n\n/** On-chain LedgerEntry struct returned by getEntry */\ninterface OnChainLedgerEntry {\n entryId: `0x${string}`;\n actorIdentityId: `0x${string}`;\n actorType: number;\n actorAddress: string;\n action: string;\n category: string;\n metadataHash: `0x${string}`;\n proofHash: `0x${string}`;\n actorSignature: string;\n platformSignature: string;\n severity: number;\n blockNumber: bigint;\n timestamp: bigint;\n}\n\n/** On-chain Escrow struct */\ninterface OnChainEscrow {\n escrowId: `0x${string}`;\n depositorIdentityId: `0x${string}`;\n beneficiaryIdentityId: `0x${string}`;\n depositor: string;\n beneficiary: string;\n amount: bigint;\n fundedAmount: bigint;\n conditionType: number;\n conditionData: `0x${string}`;\n state: number;\n createdAt: bigint;\n expiresAt: bigint;\n releasedAt: bigint;\n}\n\n/** On-chain Identity struct */\ninterface OnChainIdentity {\n identityId: `0x${string}`;\n actorType: number;\n owner: string;\n walletAddress: string;\n label: string;\n capabilities: string[];\n status: number;\n attestationCount: bigint;\n createdAt: bigint;\n}\n\n/**\n * Cryptographic verification and public explorer URLs.\n *\n * Verification is the public-facing proof layer. Any person, any system,\n * anywhere in the world can verify any Invariance action using a transaction\n * hash, an identity address, or a public explorer URL.\n *\n * The Verifier is special: it is both callable directly as `inv.verify(txHash)`\n * and has sub-methods like `inv.verify.action()`, `inv.verify.identity()`, etc.\n *\n * @example\n * ```typescript\n * // Direct call\n * const result = await inv.verify('0xtxhash...');\n *\n * // Sub-methods\n * const audit = await inv.verify.identity('0xTradingBot');\n * const url = inv.verify.url('inv_int_abc123');\n * ```\n */\nexport class Verifier {\n private readonly contracts: ContractFactory;\n private readonly telemetry: Telemetry;\n private indexer: IndexerClient | null = null;\n\n constructor(\n contracts: ContractFactory,\n _events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ) {\n this.contracts = contracts;\n this.telemetry = telemetry;\n }\n\n /** Lazily initialize the indexer client */\n private getIndexer(): IndexerClient {\n if (!this.indexer) {\n this.indexer = new IndexerClient(this.contracts.getApiBaseUrl(), this.contracts.getApiKey());\n }\n return this.indexer;\n }\n\n /**\n * Verify a single transaction by hash.\n *\n * Retrieves the on-chain proof, validates signatures, and returns\n * the full verification result with an explorer URL.\n *\n * @param txHash - The transaction hash to verify\n * @returns Verification result with proof and explorer URL\n */\n async verify(txHash: string): Promise<VerificationResult> {\n this.telemetry.track('verify.verify');\n\n try {\n const publicClient = this.contracts.getPublicClient();\n const ledgerContract = this.contracts.getContract('ledger');\n\n // 1. Fetch tx receipt from RPC (tx is already mined)\n const receipt = await publicClient.getTransactionReceipt({\n hash: txHash as `0x${string}`,\n });\n\n if (receipt.status === 'reverted') {\n throw new InvarianceError(\n ErrorCode.VERIFICATION_FAILED,\n `Transaction reverted: ${txHash}`,\n );\n }\n\n // 2. Parse EntryLogged / IntentRequested events from receipt logs using ABI decoding\n let entryId: `0x${string}` | null = null;\n\n for (const log of receipt.logs) {\n // Try EntryLogged\n try {\n const decoded = decodeEventLog({\n abi: InvarianceLedgerAbi,\n data: log.data as `0x${string}`,\n topics: log.topics as [`0x${string}`, ...`0x${string}`[]],\n });\n if (decoded.eventName === 'EntryLogged') {\n entryId = (decoded.args as { entryId: `0x${string}` }).entryId;\n break;\n }\n } catch { /* not a ledger event */ }\n\n // Try IntentRequested\n try {\n const decoded = decodeEventLog({\n abi: InvarianceIntentAbi,\n data: log.data as `0x${string}`,\n topics: log.topics as [`0x${string}`, ...`0x${string}`[]],\n });\n if (decoded.eventName === 'IntentRequested') {\n entryId = (decoded.args as { intentId: `0x${string}` }).intentId;\n break;\n }\n } catch { /* not an intent event */ }\n\n // Try CompactLedger EntryLogged\n try {\n const decoded = decodeEventLog({\n abi: InvarianceCompactLedgerAbi,\n data: log.data as `0x${string}`,\n topics: log.topics as [`0x${string}`, ...`0x${string}`[]],\n });\n if (decoded.eventName === 'EntryLogged') {\n entryId = (decoded.args as { entryId: `0x${string}` }).entryId;\n break;\n }\n } catch { /* not a compact ledger event */ }\n\n // Try AtomicVerifier AtomicVerification\n try {\n const decoded = decodeEventLog({\n abi: InvarianceAtomicVerifierAbi,\n data: log.data as `0x${string}`,\n topics: log.topics as [`0x${string}`, ...`0x${string}`[]],\n });\n if (decoded.eventName === 'AtomicVerification') {\n entryId = (decoded.args as { entryId: `0x${string}` }).entryId;\n break;\n }\n } catch { /* not an atomic verifier event */ }\n }\n\n if (!entryId) {\n throw new InvarianceError(\n ErrorCode.VERIFICATION_FAILED,\n `No Invariance events found in transaction: ${txHash}`,\n );\n }\n\n // 3. Fetch the full on-chain ledger entry\n const getEntryFn = ledgerContract.read['getEntry'];\n let entry: OnChainLedgerEntry | null = null;\n\n if (getEntryFn) {\n try {\n const rawEntry = await getEntryFn([entryId]);\n // Validate shape before casting\n if (\n rawEntry &&\n typeof rawEntry === 'object' &&\n 'entryId' in (rawEntry as Record<string, unknown>) &&\n 'actorType' in (rawEntry as Record<string, unknown>) &&\n 'timestamp' in (rawEntry as Record<string, unknown>)\n ) {\n entry = rawEntry as OnChainLedgerEntry;\n }\n } catch {\n // Entry may not be in ledger (could be intent/escrow event)\n }\n }\n\n // 4. Validate signatures\n const hasActorSig = entry ? entry.actorSignature !== '0x' : false;\n const hasPlatformSig = entry\n ? entry.platformSignature !== '0x' && entry.platformSignature.length > 2\n : false;\n const signaturesValid = hasActorSig && hasPlatformSig;\n\n // 5. Build VerificationResult\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const result: VerificationResult = {\n verified: signaturesValid && !!entry,\n // Note: No entry means unverified — the action was never logged on-chain\n txHash: receipt.transactionHash,\n action: entry ? entry.action : fromBytes32(entryId),\n actor: {\n type: entry ? enumToActorType(entry.actorType) : 'agent',\n address: entry ? entry.actorAddress : '',\n },\n timestamp: entry ? Number(entry.timestamp) * 1000 : Date.now(),\n blockNumber: Number(receipt.blockNumber),\n proof: {\n proofHash: entry ? (entry.proofHash as string) : (entryId as string),\n signatures: {\n actor: entry ? entry.actorSignature : '',\n ...(entry?.platformSignature ? { platform: entry.platformSignature } : {}),\n valid: signaturesValid,\n },\n metadataHash: entry ? (entry.metadataHash as string) : '',\n verifiable: true,\n raw: JSON.stringify({ txHash, entryId: fromBytes32(entryId), blockNumber: Number(receipt.blockNumber) }),\n },\n explorerUrl: `${explorerBase}/tx/${receipt.transactionHash}`,\n };\n\n return result;\n } catch (err) {\n if (err instanceof InvarianceError) throw err;\n throw mapContractError(err);\n }\n }\n\n /**\n * Verify by actor address and optionally action type and timeframe.\n *\n * @param opts - Verification options (actor, action, time range)\n * @returns Verification result for the matching action\n */\n async action(opts: VerifyActionOptions): Promise<VerificationResult> {\n this.telemetry.track('verify.action', { action: opts.action });\n\n try {\n // Try indexer first for efficient lookup\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (available) {\n const params: Record<string, string | number | undefined> = {\n actorAddress: opts.actor,\n action: opts.action,\n from: typeof opts.from === 'string' ? opts.from : opts.from?.toString(),\n to: typeof opts.to === 'string' ? opts.to : opts.to?.toString(),\n page: 1,\n pageSize: 1,\n };\n\n try {\n const entries = await indexer.get<Array<Record<string, unknown>>>('/ledger', params);\n if (entries.length > 0) {\n const txHash = (entries[0]!['txHash'] ?? entries[0]!['tx_hash']) as string | undefined;\n if (txHash) {\n return this.verify(txHash);\n }\n }\n } catch (indexerErr) {\n this.telemetry.track('verify.action.indexerError', {\n error: indexerErr instanceof Error ? indexerErr.message : String(indexerErr),\n });\n // Fall through to error\n }\n }\n\n throw new InvarianceError(\n ErrorCode.VERIFICATION_FAILED,\n `No verified action found for actor: ${opts.actor}`,\n );\n } catch (err) {\n if (err instanceof InvarianceError) throw err;\n throw mapContractError(err);\n }\n }\n\n /**\n * Full audit of an identity.\n *\n * Returns comprehensive verification data including total actions,\n * verified count, policy history, attestations, and volume.\n *\n * @param address - The identity address to audit\n * @returns Full identity verification audit\n */\n async identity(address: string): Promise<IdentityVerification> {\n this.telemetry.track('verify.identity');\n\n try {\n const identityContract = this.contracts.getContract('identity');\n\n // Resolve identity first (needed for subsequent calls)\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) {\n throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n }\n const identityId = await resolveFn([address as `0x${string}`]) as `0x${string}`;\n\n // Batch identity struct + attestations via multicall (single RPC round-trip)\n const publicClient = this.contracts.getPublicClient();\n let rawIdentity: OnChainIdentity;\n let rawAttestationsResult: { success: boolean; data: unknown } = { success: false, data: null };\n\n if (typeof publicClient.multicall === 'function') {\n const identityAddr = this.contracts.getAddress('identity') as `0x${string}`;\n const { InvarianceIdentityAbi } = await import('../../contracts/abis/index.js');\n\n const batchResults = await publicClient.multicall({\n contracts: [\n { address: identityAddr, abi: InvarianceIdentityAbi, functionName: 'get', args: [identityId] },\n { address: identityAddr, abi: InvarianceIdentityAbi, functionName: 'getAttestations', args: [identityId] },\n ],\n });\n\n if (batchResults[0].status === 'failure') {\n throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'Failed to fetch identity');\n }\n rawIdentity = batchResults[0].result as unknown as OnChainIdentity;\n if (batchResults[1].status === 'success') {\n rawAttestationsResult = { success: true, data: batchResults[1].result };\n }\n } else {\n // Fallback: sequential reads (for environments without multicall support)\n const getFn = identityContract.read['get'];\n if (!getFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'get function not found');\n rawIdentity = await getFn([identityId]) as OnChainIdentity;\n\n const getAttFn = identityContract.read['getAttestations'];\n if (getAttFn) {\n try {\n rawAttestationsResult = { success: true, data: await getAttFn([identityId]) };\n } catch { /* Attestations may not be available */ }\n }\n }\n\n let attestations: Array<{\n attestationId: string;\n identity: string;\n attester: string;\n claim: string;\n evidence?: string;\n expiresAt?: number;\n txHash: string;\n verified: boolean;\n }> = [];\n if (rawAttestationsResult.success) {\n try {\n const rawAttestations = rawAttestationsResult.data as Array<{\n attestationId: `0x${string}`;\n attester: string;\n claim: string;\n evidence: string;\n expiresAt: bigint;\n revoked: boolean;\n txHash: string;\n }>;\n attestations = rawAttestations.map((a) => {\n const att: {\n attestationId: string;\n identity: string;\n attester: string;\n claim: string;\n evidence?: string;\n expiresAt?: number;\n txHash: string;\n verified: boolean;\n } = {\n attestationId: fromBytes32(a.attestationId),\n identity: fromBytes32(identityId),\n attester: a.attester,\n claim: a.claim,\n txHash: a.txHash ?? '',\n verified: !a.revoked,\n };\n if (a.evidence) att.evidence = a.evidence;\n if (Number(a.expiresAt) > 0) att.expiresAt = Number(a.expiresAt);\n return att;\n });\n } catch {\n // Attestations may not be available\n }\n }\n\n // Query indexer for action metrics\n let totalActions = 0;\n let verifiedActions = 0;\n let totalVolume = '0';\n let actionsByType: Record<string, number> = {};\n let policyHistory: Array<{ policyId: string; evaluations: number; violations: number }> = [];\n\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n if (available) {\n try {\n const metrics = await indexer.get<{\n totalActions: number;\n verifiedActions: number;\n totalVolume: string;\n actionsByType: Record<string, number>;\n policyHistory: Array<{ policyId: string; evaluations: number; violations: number }>;\n }>(`/reputation/metrics/${address}`);\n totalActions = metrics.totalActions;\n verifiedActions = metrics.verifiedActions ?? metrics.totalActions;\n totalVolume = metrics.totalVolume ?? '0';\n actionsByType = metrics.actionsByType ?? {};\n policyHistory = metrics.policyHistory ?? [];\n } catch {\n // Indexer metrics unavailable\n }\n }\n\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const statusMap: Record<number, 'active' | 'suspended' | 'deactivated'> = {\n 0: 'active', 1: 'suspended', 2: 'deactivated',\n };\n\n return {\n identity: {\n identityId: fromBytes32(identityId),\n type: enumToActorType(rawIdentity.actorType),\n address: rawIdentity.walletAddress || address,\n owner: rawIdentity.owner,\n label: rawIdentity.label,\n capabilities: rawIdentity.capabilities ?? [],\n status: statusMap[rawIdentity.status] ?? 'active',\n attestations: Number(rawIdentity.attestationCount ?? 0),\n createdAt: Number(rawIdentity.createdAt ?? 0),\n txHash: '',\n explorerUrl: `${explorerBase}/identity/${fromBytes32(identityId)}`,\n },\n totalActions,\n verifiedActions,\n failedVerifications: totalActions - verifiedActions,\n actionsByType,\n totalVolume,\n policyHistory,\n attestations,\n explorerUrl: `${explorerBase}/identity/${fromBytes32(identityId)}`,\n };\n } catch (err) {\n if (err instanceof InvarianceError) throw err;\n throw mapContractError(err);\n }\n }\n\n /**\n * Escrow audit trail.\n *\n * Returns the complete timeline of an escrow from creation to\n * final state, with proof bundles for each state transition.\n *\n * @param escrowId - The escrow to audit\n * @returns Escrow verification with full timeline\n */\n async escrow(escrowId: string): Promise<EscrowVerification> {\n this.telemetry.track('verify.escrow');\n\n try {\n const escrowContract = this.contracts.getContract('escrow');\n\n // Fetch escrow on-chain\n const getEscrowFn = escrowContract.read['getEscrow'];\n if (!getEscrowFn) {\n throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getEscrow function not found');\n }\n const escrowIdBytes = toBytes32(escrowId);\n const rawEscrow = await getEscrowFn([escrowIdBytes]) as OnChainEscrow;\n\n if (rawEscrow.createdAt === 0n) {\n throw new InvarianceError(ErrorCode.ESCROW_NOT_FOUND, `Escrow not found: ${escrowId}`);\n }\n\n // Map on-chain state to EscrowState (active/resolved mapped to nearest equivalents)\n const ESCROW_STATE_TO_TYPE: Record<number, EscrowState> = {\n 0: 'created', 1: 'funded', 2: 'funded', // active → funded\n 3: 'released', 4: 'refunded', 5: 'disputed', 6: 'released', // resolved → released\n };\n const state: EscrowState = ESCROW_STATE_TO_TYPE[rawEscrow.state] ?? 'created';\n\n // Query indexer for timeline\n let timeline: Array<{\n event: string;\n txHash: string;\n timestamp: number;\n actor: { type: 'agent' | 'human' | 'device' | 'service'; address: string };\n proof: {\n proofHash: string;\n signatures: { actor: string; platform?: string; valid: boolean };\n metadataHash: string;\n verifiable: boolean;\n raw: string;\n };\n }> = [];\n\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n if (available) {\n try {\n timeline = await indexer.get<typeof timeline>(`/escrows/${escrowId}/timeline`);\n } catch {\n // Build minimal timeline from on-chain data\n }\n }\n\n // Build minimal timeline if indexer unavailable\n if (timeline.length === 0) {\n timeline.push({\n event: 'created',\n txHash: '',\n timestamp: Number(rawEscrow.createdAt),\n actor: { type: 'agent', address: rawEscrow.depositor },\n proof: {\n proofHash: escrowIdBytes,\n signatures: { actor: '', valid: false },\n metadataHash: '',\n verifiable: false,\n raw: '',\n },\n });\n }\n\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const amount = fromUSDCWei(rawEscrow.amount);\n\n return {\n escrowId,\n verified: timeline.length > 0,\n timeline,\n depositor: { type: 'agent', address: rawEscrow.depositor },\n recipient: { type: 'agent', address: rawEscrow.beneficiary },\n amount,\n finalState: state,\n explorerUrl: `${explorerBase}/escrow/${escrowId}`,\n };\n } catch (err) {\n if (err instanceof InvarianceError) throw err;\n throw mapContractError(err);\n }\n }\n\n /**\n * Decode and validate a proof by its hash.\n *\n * @param proofHash - The proof hash to decode\n * @returns Decoded proof data with validation status\n */\n async proof(proofHash: string): Promise<ProofData> {\n this.telemetry.track('verify.proof');\n\n try {\n // Query indexer for entries matching proofHash\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (available) {\n try {\n const entries = await indexer.get<Array<Record<string, unknown>>>('/ledger', {\n proofHash,\n page: 1,\n pageSize: 1,\n });\n\n if (entries.length > 0) {\n const entry = entries[0]!;\n const actorAddress = (entry['actorAddress'] ?? entry['actor_address']) as string | undefined;\n const actorType = (entry['actorType'] ?? entry['actor_type']) as string | undefined;\n const timestamp = (entry['timestamp'] ?? entry['created_at']) as string | number | undefined;\n const blockNumber = (entry['blockNumber'] ?? entry['block_number']) as number | string | undefined;\n const metadataHash = (entry['metadataHash'] ?? entry['metadata_hash']) as string | undefined;\n const actorSignature = (entry['actorSignature'] ?? entry['actor_signature']) as string | undefined;\n const platformSignature = (entry['platformSignature'] ?? entry['platform_signature']) as string | undefined;\n\n return {\n proofHash,\n actor: {\n type: (actorType as 'agent' | 'human' | 'device' | 'service') || 'agent',\n address: actorAddress ?? '',\n },\n action: String(entry['action'] ?? ''),\n timestamp: typeof timestamp === 'string' ? Date.parse(timestamp) : Number(timestamp ?? 0),\n blockNumber: Number(blockNumber ?? 0),\n signatures: {\n actor: actorSignature ?? '',\n platform: platformSignature ?? '',\n valid: (actorSignature ?? '') !== '0x' && (actorSignature ?? '').length >= 132,\n },\n metadataHash: metadataHash ?? '',\n raw: JSON.stringify(entry),\n verified: true,\n };\n }\n } catch {\n // Fall through\n }\n }\n\n // Try on-chain lookup via ledger contract\n const ledgerContract = this.contracts.getContract('ledger');\n const getByProofFn = ledgerContract.read['getEntryByProof'];\n if (getByProofFn) {\n try {\n const entry = await getByProofFn([toBytes32(proofHash)]) as OnChainLedgerEntry;\n if (entry && entry.timestamp > 0n) {\n return {\n proofHash,\n actor: {\n type: enumToActorType(entry.actorType),\n address: entry.actorAddress,\n },\n action: entry.action,\n timestamp: Number(entry.timestamp) * 1000,\n blockNumber: Number(entry.blockNumber),\n signatures: {\n actor: entry.actorSignature,\n platform: entry.platformSignature,\n valid: entry.actorSignature !== '0x' && entry.platformSignature !== '0x' && entry.platformSignature.length >= 132,\n },\n metadataHash: entry.metadataHash,\n raw: JSON.stringify({ entryId: fromBytes32(entry.entryId), proofHash }),\n verified: true,\n };\n }\n } catch {\n // Function may not exist\n }\n }\n\n throw new InvarianceError(\n ErrorCode.VERIFICATION_FAILED,\n `Proof not found: ${proofHash}`,\n );\n } catch (err) {\n if (err instanceof InvarianceError) throw err;\n throw mapContractError(err);\n }\n }\n\n /**\n * Batch verify multiple transactions.\n *\n * More efficient than calling verify() in a loop when verifying\n * multiple transactions simultaneously.\n *\n * @param txHashes - Array of transaction hashes to verify\n * @returns Array of verification results (one per hash)\n */\n async bulk(txHashes: string[]): Promise<VerificationResult[]> {\n this.telemetry.track('verify.bulk', { count: txHashes.length });\n\n const settled = await Promise.allSettled(\n txHashes.map((h) => this.verify(h)),\n );\n\n return settled.map((result, i) => {\n if (result.status === 'fulfilled') {\n return result.value;\n }\n // Return a failed verification result for rejected promises\n const explorerBase = this.contracts.getExplorerBaseUrl();\n return {\n verified: false,\n txHash: txHashes[i]!,\n action: '',\n actor: { type: 'agent' as const, address: '' },\n timestamp: Date.now(),\n blockNumber: 0,\n proof: {\n proofHash: '',\n signatures: { actor: '', valid: false },\n metadataHash: '',\n verifiable: false,\n raw: '',\n },\n explorerUrl: `${explorerBase}/tx/${txHashes[i]!}`,\n };\n });\n }\n\n /**\n * Verify a CompactLedger commitment hash on-chain.\n *\n * Reads the stored commitment from the CompactLedger contract and\n * optionally reconstructs the expected commitment to compare.\n *\n * @param entryId - The entry ID to verify\n * @param expected - Optional expected values to reconstruct and compare commitment\n * @returns Whether the commitment exists and matches\n */\n async verifyCommitment(entryId: string, expected?: {\n actorAddress: string;\n action: string;\n metadataHash: string;\n proofHash: string;\n timestamp: number;\n }): Promise<{ exists: boolean; matches: boolean; commitmentHash: string }> {\n this.telemetry.track('verify.commitment');\n\n try {\n const compactLedger = this.contracts.getContract('compactLedger');\n const getCommitmentFn = compactLedger.read['getCommitment'];\n if (!getCommitmentFn) {\n throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getCommitment function not found');\n }\n\n const commitment = await getCommitmentFn([toBytes32(entryId)]) as `0x${string}`;\n const exists = commitment !== '0x0000000000000000000000000000000000000000000000000000000000000000';\n\n let matches = false;\n if (exists && expected) {\n // Reconstruct expected commitment: keccak256(abi.encodePacked(actorAddress, action, metadataHash, proofHash, timestamp))\n const { keccak256, encodePacked } = await import('viem');\n const reconstructed = keccak256(\n encodePacked(\n ['address', 'string', 'bytes32', 'bytes32', 'uint256'],\n [\n expected.actorAddress as `0x${string}`,\n expected.action,\n expected.metadataHash as `0x${string}`,\n expected.proofHash as `0x${string}`,\n BigInt(expected.timestamp),\n ],\n ),\n );\n matches = reconstructed === commitment;\n }\n\n return { exists, matches, commitmentHash: commitment };\n } catch (err) {\n if (err instanceof InvarianceError) throw err;\n throw mapContractError(err);\n }\n }\n\n /**\n * Generate a public explorer URL for an intent.\n *\n * This URL can be shared publicly. Anyone can open it to\n * independently verify the action without needing the SDK.\n *\n * @param intentId - The intent ID to generate a URL for\n * @returns The public explorer URL\n */\n url(intentId: string): string {\n this.telemetry.track('verify.url');\n\n const base = this.contracts.getExplorerBaseUrl();\n return `${base}/v/${intentId}`;\n }\n\n /**\n * Verify a vote's merkle inclusion in a settled proposal.\n *\n * @param proposalId - The proposal ID\n * @param voter - Voter address\n * @param support - Vote direction (true = for)\n * @param weight - Vote weight\n * @param proof - Merkle proof\n * @returns Whether the vote is included in the settled merkle root\n */\n async verifyVote(\n proposalId: string,\n voter: string,\n support: boolean,\n weight: bigint,\n proof: string[],\n ): Promise<boolean> {\n this.telemetry.track('verify.vote');\n\n try {\n const votingContract = this.contracts.getContract('voting');\n const readFn = votingContract.read['verifyVote'];\n if (!readFn) {\n throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'verifyVote function not found');\n }\n\n return await readFn([\n toBytes32(proposalId),\n voter as `0x${string}`,\n support,\n weight,\n proof as `0x${string}`[],\n ]) as boolean;\n } catch (err) {\n if (err instanceof InvarianceError) throw err;\n throw mapContractError(err);\n }\n }\n}\n","import type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport {\n toBytes32,\n fromBytes32,\n waitForReceipt,\n mapContractError,\n parseAtomicEntryIdFromLogs,\n hashMetadata,\n mapSeverity,\n generateActorSignatureEIP712,\n generatePlatformAttestationEIP712,\n} from '../../utils/contract-helpers.js';\nimport type { LedgerEventInput, LedgerEntry } from '../ledger/types.js';\n\n/**\n * Single-transaction atomic verifier: identity check + policy eval + compact ledger log.\n *\n * Wraps `AtomicVerifier.verifyAndLog()` with the same EIP-712 signing flow\n * as {@link EventLedgerCompact}. Requires an API key for platform attestation.\n *\n * @example\n * ```typescript\n * const entry = await inv.atomic.verifyAndLog({\n * action: 'swap',\n * actor: { type: 'agent', address: '0xBot' },\n * metadata: { from: 'USDC', to: 'ETH', amount: '100' },\n * });\n * ```\n */\nexport class AtomicVerifier {\n private readonly contracts: ContractFactory;\n private readonly events: InvarianceEventEmitter;\n private readonly telemetry: Telemetry;\n\n constructor(\n contracts: ContractFactory,\n events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ) {\n this.contracts = contracts;\n this.events = events;\n this.telemetry = telemetry;\n }\n\n /** Get the contract address for the atomic verifier */\n getContractAddress(): string {\n return this.contracts.getAddress('atomicVerifier');\n }\n\n /**\n * Verify identity + evaluate policy + log to CompactLedger in a single transaction.\n *\n * @param event - The event to verify and log\n * @returns The created ledger entry with proof bundle\n * @throws {InvarianceError} If no API key is configured\n */\n async verifyAndLog(event: LedgerEventInput): Promise<LedgerEntry> {\n this.telemetry.track('atomic.verifyAndLog', {\n action: event.action,\n category: event.category ?? 'custom',\n });\n\n try {\n const atomicVerifier = this.contracts.getContract('atomicVerifier');\n const identityContract = this.contracts.getContract('identity');\n\n // Resolve actor identity ID\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n const identityId = await resolveFn([event.actor.address as `0x${string}`]) as `0x${string}`;\n\n // Hash metadata\n const metadata = event.metadata ?? {};\n const metadataHash = hashMetadata(metadata);\n\n // Build compact input struct\n const compactInput = {\n actorIdentityId: identityId,\n actorAddress: event.actor.address,\n action: event.action,\n category: event.category ?? 'custom',\n metadataHash,\n proofHash: metadataHash,\n severity: mapSeverity(event.severity ?? 'info'),\n };\n\n // Generate EIP-712 dual signatures\n const domain = this.contracts.getCompactLedgerDomain();\n const walletClient = this.contracts.getWalletClient();\n\n const actorSig = await generateActorSignatureEIP712(compactInput, domain, walletClient);\n const platformSig = await generatePlatformAttestationEIP712(\n compactInput,\n this.contracts.getApiKey(),\n this.contracts.getApiBaseUrl(),\n );\n\n // Single tx: verifyAndLog\n const verifyAndLogFn = atomicVerifier.write['verifyAndLog'];\n if (!verifyAndLogFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'verifyAndLog function not found on AtomicVerifier');\n const txHash = await verifyAndLogFn([compactInput, actorSig, platformSig]);\n\n const optimistic = this.contracts.getConfirmation() === 'optimistic';\n const receiptClient = this.contracts.getReceiptClient();\n const receipt = await waitForReceipt(receiptClient, txHash, { optimistic });\n const entryId = optimistic\n ? toBytes32(txHash)\n : parseAtomicEntryIdFromLogs(receipt.logs);\n\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const result: LedgerEntry = {\n entryId: fromBytes32(entryId),\n action: event.action,\n actor: event.actor,\n category: event.category ?? 'custom',\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n timestamp: Date.now(),\n proof: {\n proofHash: metadataHash,\n signatures: {\n actor: actorSig,\n platform: platformSig,\n valid: true,\n },\n metadataHash,\n verifiable: true,\n raw: JSON.stringify({ entryId: fromBytes32(entryId), txHash: receipt.txHash, mode: 'atomic' }),\n },\n metadataHash,\n ...(event.metadata !== undefined && { metadata: event.metadata }),\n explorerUrl: `${explorerBase}/tx/${receipt.txHash}`,\n };\n\n this.events.emit('ledger.logged', {\n entryId: result.entryId,\n action: event.action,\n });\n\n return result;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n}\n","import type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport { ErrorCode, type OnChainMetrics } from '@invariance/common';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport { IndexerClient } from '../../utils/indexer-client.js';\nimport { mapReviewRow, toTimestamp } from '../../utils/indexer-mappers.js';\nimport {\n toBytes32,\n fromBytes32,\n waitForReceipt,\n mapContractError,\n parseReviewIdFromLogs,\n hashMetadata,\n} from '../../utils/contract-helpers.js';\nimport type {\n ReputationProfile,\n ReputationScore,\n SubmitReviewOptions,\n Review,\n Badge,\n ComparisonResult,\n ScoreHistory,\n ReviewList,\n ReviewQueryOptions,\n ScoreHistoryOptions,\n} from './types.js';\n\n/** On-chain ReviewStats struct */\ninterface OnChainReviewStats {\n totalReviews: bigint;\n totalRating: bigint;\n totalQuality: bigint;\n totalCommunication: bigint;\n totalSpeed: bigint;\n totalValue: bigint;\n}\n\n/**\n * Auto-calculated reputation scores and 1-5 star reviews.\n *\n * Reputation applies to all identity types. The scoring model is identical.\n * Reviews are 1-5 stars, cryptographically linked to completed escrows.\n * No escrow = no review. Fake reviews are mathematically impossible.\n *\n * @example\n * ```typescript\n * const rep = await inv.reputation.get('0xTradingBot');\n * console.log(rep.scores.overall, rep.scores.tier);\n *\n * const review = await inv.reputation.review({\n * target: '0xTradingBot',\n * escrowId: 'esc_abc',\n * rating: 5,\n * comment: 'Excellent execution',\n * });\n * ```\n */\nexport class ReputationEngine {\n private readonly contracts: ContractFactory;\n private readonly events: InvarianceEventEmitter;\n private readonly telemetry: Telemetry;\n private indexer: IndexerClient | null = null;\n\n constructor(\n contracts: ContractFactory,\n events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ) {\n this.contracts = contracts;\n this.events = events;\n this.telemetry = telemetry;\n }\n\n /** Lazily initialize the indexer client */\n private getIndexer(): IndexerClient {\n if (!this.indexer) {\n this.indexer = new IndexerClient(this.contracts.getApiBaseUrl(), this.contracts.getApiKey());\n }\n return this.indexer;\n }\n\n /** Calculate on-chain metrics for an identity */\n private async calculateOnChainMetrics(identityId: `0x${string}`): Promise<OnChainMetrics> {\n try {\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (available) {\n const data = await indexer.get<OnChainMetrics>(`/reputation/metrics/${fromBytes32(identityId)}`);\n return data;\n }\n } catch {\n // Fall through to default\n }\n\n return {\n totalActions: 0,\n successfulEscrows: 0,\n failedEscrows: 0,\n disputedEscrows: 0,\n disputesWon: 0,\n disputesLost: 0,\n successRate: 0,\n totalVolumeUsdc: '0',\n avgCompletionTimeSeconds: 0,\n firstAction: 0,\n lastAction: 0,\n uniqueCounterparties: 0,\n policyViolations: 0,\n actorType: 'agent',\n };\n }\n\n /** Calculate overall reputation score */\n private calculateOverallScore(reviewAvg: number, metrics: OnChainMetrics): number {\n const reliability = metrics.successRate / 100;\n const volume = Math.min(metrics.totalActions / 100, 1);\n const compliance = Math.max(0, 1 - (metrics.policyViolations / Math.max(metrics.totalActions, 1)));\n\n return (\n reviewAvg * 0.4 +\n reliability * 30 * 0.3 +\n volume * 100 * 0.15 +\n compliance * 100 * 0.15\n );\n }\n\n /** Determine tier from overall score */\n private determineTier(score: number): 'unrated' | 'bronze' | 'silver' | 'gold' | 'platinum' {\n if (score >= 90) return 'platinum';\n if (score >= 75) return 'gold';\n if (score >= 60) return 'silver';\n if (score >= 40) return 'bronze';\n return 'unrated';\n }\n\n /** Get the contract address for the review module */\n getContractAddress(): string {\n return this.contracts.getAddress('review');\n }\n\n /**\n * Get full reputation profile for any identity.\n *\n * Includes scores, reviews, on-chain metrics, badges, and explorer URL.\n *\n * @param address - The identity address\n * @returns Full reputation profile\n */\n async get(address: string): Promise<ReputationProfile> {\n this.telemetry.track('reputation.get');\n\n try {\n const identityContract = this.contracts.getContract('identity');\n\n // Get identity\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n const identityId = await resolveFn([address as `0x${string}`]) as `0x${string}`;\n\n // Get scores\n const scores = await this.score(address);\n\n // Get recent reviews\n const recentReviews = await this.getReviews(address, { limit: 5 });\n\n // Get badge\n const badge = await this.badge(address);\n\n // Get on-chain metrics\n const onChainMetrics = await this.calculateOnChainMetrics(identityId);\n\n const explorerBase = this.contracts.getExplorerBaseUrl();\n\n return {\n identity: {\n identityId: fromBytes32(identityId),\n type: 'agent',\n address,\n owner: address,\n label: '',\n capabilities: [],\n status: 'active',\n attestations: 0,\n createdAt: 0,\n txHash: '',\n explorerUrl: `${explorerBase}/identity/${fromBytes32(identityId)}`,\n },\n scores,\n reviews: {\n average: scores.reviewAverage,\n count: scores.reviewCount,\n distribution: { '1': 0, '2': 0, '3': 0, '4': 0, '5': 0 },\n recentReviews: recentReviews.reviews,\n },\n onChainMetrics,\n badge,\n lastUpdated: Date.now(),\n explorerUrl: `${explorerBase}/reputation/${address}`,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Submit a 1-5 star review.\n *\n * Reviews MUST reference a completed escrow between the reviewer\n * and the target. This is enforced on-chain. No escrow = no review.\n *\n * @param opts - Review options (target, escrowId, rating)\n * @returns The submitted review\n * @throws {InvarianceError} With NO_ESCROW_FOR_REVIEW if no qualifying escrow\n * @throws {InvarianceError} With ALREADY_REVIEWED if already reviewed\n */\n async review(opts: SubmitReviewOptions): Promise<Review> {\n if (opts.rating < 1 || opts.rating > 5 || !Number.isInteger(opts.rating)) {\n throw new InvarianceError(ErrorCode.NETWORK_ERROR, `Invalid rating: ${opts.rating}. Must be an integer between 1 and 5.`);\n }\n\n this.telemetry.track('reputation.review', { rating: opts.rating });\n\n try {\n const contract = this.contracts.getContract('review');\n const identityContract = this.contracts.getContract('identity');\n const publicClient = this.contracts.getPublicClient();\n\n // Get current account\n const accountAddress = this.contracts.getWalletAddress() as `0x${string}`;\n\n // Resolve reviewer and target identity IDs\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n\n const reviewerIdentityId = await resolveFn([accountAddress]) as `0x${string}`;\n const targetIdentityId = await resolveFn([opts.target as `0x${string}`]) as `0x${string}`;\n\n // Hash comment\n const commentHash = opts.comment ? hashMetadata({ comment: opts.comment }) : toBytes32('');\n\n // Default category ratings to overall rating\n const qualityRating = opts.categories?.quality ?? opts.rating;\n const communicationRating = opts.categories?.communication ?? opts.rating;\n const speedRating = opts.categories?.speed ?? opts.rating;\n const valueRating = opts.categories?.value ?? opts.rating;\n\n // Submit review\n const submitFn = contract.write['submit'];\n if (!submitFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'submit function not found');\n\n const escrowIdBytes = toBytes32(opts.escrowId);\n const txHash = await submitFn([\n reviewerIdentityId,\n targetIdentityId,\n escrowIdBytes,\n opts.rating,\n commentHash,\n qualityRating,\n communicationRating,\n speedRating,\n valueRating,\n ]);\n\n const receipt = await waitForReceipt(publicClient, txHash);\n const reviewId = parseReviewIdFromLogs(receipt.logs);\n\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const result: Review = {\n reviewId: fromBytes32(reviewId),\n reviewer: { type: 'agent', address: accountAddress },\n target: { type: 'agent', address: opts.target },\n escrowId: opts.escrowId,\n rating: opts.rating,\n ...(opts.comment !== undefined && { comment: opts.comment }),\n ...(opts.categories !== undefined && { categories: opts.categories }),\n timestamp: Date.now(),\n txHash: receipt.txHash,\n verified: true,\n explorerUrl: `${explorerBase}/tx/${receipt.txHash}`,\n };\n\n const reviewedPayload: {\n reviewId: string;\n target: string;\n rating: 1 | 2 | 3 | 4 | 5;\n reviewer: `0x${string}`;\n reviewerIdentityId: string;\n targetIdentityId: string;\n escrowId: string;\n commentHash: `0x${string}`;\n categories?: Record<string, number>;\n } = {\n reviewId: result.reviewId,\n target: opts.target,\n rating: opts.rating,\n reviewer: accountAddress,\n reviewerIdentityId: fromBytes32(reviewerIdentityId),\n targetIdentityId: fromBytes32(targetIdentityId),\n escrowId: opts.escrowId,\n commentHash: commentHash,\n };\n if (opts.categories !== undefined) reviewedPayload.categories = opts.categories as Record<string, number>;\n this.events.emit('reputation.reviewed', reviewedPayload);\n\n return result;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Get all reviews for an identity.\n *\n * @param address - The identity address\n * @param opts - Optional query options (pagination, sorting)\n * @returns Paginated review list\n */\n async getReviews(address: string, opts?: ReviewQueryOptions): Promise<ReviewList> {\n this.telemetry.track('reputation.getReviews');\n\n try {\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (!available) {\n return { reviews: [], total: 0, page: 1 };\n }\n\n const pageSize = Math.max(1, opts?.limit ?? 10);\n const offset = Math.max(0, opts?.offset ?? 0);\n const page = Math.floor(offset / pageSize) + 1;\n const params: Record<string, string | number | undefined> = {\n page,\n pageSize,\n };\n\n const { data: rows, total } = await indexer.getPaginated<Record<string, unknown>>(`/reputation/${address}/reviews`, params);\n const explorerBase = this.contracts.getExplorerBaseUrl();\n return {\n reviews: rows.map((row) => mapReviewRow(row, explorerBase)),\n total,\n page,\n };\n } catch {\n return { reviews: [], total: 0, page: 1 };\n }\n }\n\n /**\n * Get numeric reputation scores only (lighter than full profile).\n *\n * @param address - The identity address\n * @returns Reputation scores\n */\n async score(address: string): Promise<ReputationScore> {\n this.telemetry.track('reputation.score');\n\n try {\n const contract = this.contracts.getContract('review');\n const identityContract = this.contracts.getContract('identity');\n\n // Resolve identity ID\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n const identityId = await resolveFn([address as `0x${string}`]) as `0x${string}`;\n\n // Get review stats\n const getStatsFn = contract.read['getStats'];\n if (!getStatsFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getStats function not found');\n const stats = await getStatsFn([identityId]) as OnChainReviewStats;\n\n const reviewCount = Number(stats.totalReviews);\n const reviewAverage = reviewCount > 0 ? Number(stats.totalRating) / reviewCount : 0;\n\n // Get on-chain metrics\n const metrics = await this.calculateOnChainMetrics(identityId);\n\n const overall = this.calculateOverallScore(reviewAverage, metrics);\n const tier = this.determineTier(overall);\n\n return {\n overall,\n reliability: metrics.successRate,\n speed: metrics.avgCompletionTimeSeconds > 0 ? Math.max(0, 100 - metrics.avgCompletionTimeSeconds / 3600) : 0,\n volume: Math.min(metrics.totalActions / 10, 100),\n consistency: reviewCount > 5 ? 80 : reviewCount * 16,\n policyCompliance: Math.max(0, 100 - (metrics.policyViolations / Math.max(metrics.totalActions, 1)) * 100),\n reviewAverage,\n reviewCount,\n tier,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Compare multiple identities side-by-side.\n *\n * Returns ranked comparison with key metrics for each identity.\n *\n * @param addresses - Array of identity addresses to compare\n * @returns Comparison result with rankings\n */\n async compare(addresses: string[]): Promise<ComparisonResult> {\n this.telemetry.track('reputation.compare', { count: addresses.length });\n\n try {\n // Fetch scores for all addresses in parallel\n const scoresPromises = addresses.map((addr) => this.score(addr).catch(() => null));\n const metricsPromises = addresses.map(async (addr) => {\n const identityContract = this.contracts.getContract('identity');\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) return null;\n const identityId = await resolveFn([addr as `0x${string}`]) as `0x${string}`;\n return this.calculateOnChainMetrics(identityId).catch(() => null);\n });\n\n const [scoresResults, metricsResults] = await Promise.all([\n Promise.all(scoresPromises),\n Promise.all(metricsPromises),\n ]);\n\n const identities = addresses.map((addr, i) => {\n const scores = scoresResults[i];\n const metrics = metricsResults[i];\n return {\n address: addr,\n type: metrics?.actorType ?? 'agent' as const,\n overall: scores?.overall ?? 0,\n reviewAverage: scores?.reviewAverage ?? 0,\n successRate: metrics?.successRate ?? 0,\n totalVolume: metrics?.totalVolumeUsdc ?? '0',\n tier: scores?.tier ?? 'unrated',\n };\n });\n\n // Sort by overall score descending\n const ranked = [...identities]\n .sort((a, b) => b.overall - a.overall)\n .map((i) => i.address);\n\n return { identities, ranked };\n } catch {\n return { identities: [], ranked: [] };\n }\n }\n\n /**\n * Get earned badge for an identity.\n *\n * Badges are auto-calculated based on on-chain metrics:\n * - Verified: Has attestations\n * - Trusted: 50+ verified actions\n * - Elite: 95%+ policy compliance with 100+ actions\n *\n * @param address - The identity address\n * @returns Badge or null if none earned\n */\n async badge(address: string): Promise<Badge | null> {\n this.telemetry.track('reputation.badge');\n\n try {\n const scores = await this.score(address);\n const identityContract = this.contracts.getContract('identity');\n\n // Resolve identity ID\n const resolveFn = identityContract.read['resolve'];\n if (!resolveFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'resolve function not found');\n const identityId = await resolveFn([address as `0x${string}`]) as `0x${string}`;\n\n // Get on-chain metrics\n const metrics = await this.calculateOnChainMetrics(identityId);\n\n // Elite badge: 95%+ policy compliance with 100+ actions\n if (metrics.totalActions >= 100 && scores.policyCompliance >= 95) {\n return {\n type: 'elite',\n label: 'Elite (95%+ compliance, 100+ actions)',\n earnedAt: Date.now(),\n };\n }\n\n // Trusted badge: 50+ verified actions\n if (metrics.totalActions >= 50) {\n return {\n type: 'trusted',\n label: 'Trusted (50+ actions)',\n earnedAt: Date.now(),\n };\n }\n\n // Verified badge: Has attestations\n const getFn = identityContract.read['get'];\n if (getFn) {\n const identity = await getFn([identityId]);\n if (identity && (identity as { attestations?: number }).attestations && (identity as { attestations: number }).attestations > 0) {\n return {\n type: 'verified',\n label: 'Verified Identity',\n earnedAt: Date.now(),\n };\n }\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n /**\n * Get score changes over time.\n *\n * @param address - The identity address\n * @param opts - Optional query options (time range, limit)\n * @returns Score history with entries\n */\n async history(address: string, opts?: ScoreHistoryOptions): Promise<ScoreHistory> {\n this.telemetry.track('reputation.history');\n\n try {\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (!available) {\n return { address, entries: [] };\n }\n\n const pageSize = Math.max(1, opts?.limit ?? 100);\n const params: Record<string, string | number | undefined> = {\n page: 1,\n pageSize,\n from: typeof opts?.from === 'string' ? opts.from : opts?.from?.toString(),\n to: typeof opts?.to === 'string' ? opts.to : opts?.to?.toString(),\n };\n\n const rows = await indexer.get<Record<string, unknown>[]>(`/reputation/${address}/history`, params);\n const entries = rows.map((row) => ({\n timestamp: toTimestamp(row['timestamp']),\n overall: typeof row['overall'] === 'number' ? row['overall'] as number : 0,\n event: String(row['event'] ?? ''),\n }));\n return { address, entries };\n } catch {\n return { address, entries: [] };\n }\n }\n}\n","import type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport { formatEther } from 'viem';\nimport type { GasEstimate, GasBalance, EstimateGasOptions } from './types.js';\n\n/** Gas limits by action type (conservative estimates) */\nconst GAS_LIMITS: Record<string, number> = {\n 'register': 200_000,\n 'update': 150_000,\n 'policy': 250_000,\n 'create-policy': 250_000,\n 'attach-policy': 150_000,\n 'intent': 200_000,\n 'request': 200_000,\n 'approve': 100_000,\n 'reject': 80_000,\n 'escrow': 250_000,\n 'create-escrow': 250_000,\n 'fund': 150_000,\n 'release': 120_000,\n 'refund': 120_000,\n 'dispute': 150_000,\n 'ledger': 150_000,\n 'log': 150_000,\n 'review': 180_000,\n 'swap': 200_000,\n 'transfer': 100_000,\n};\n\n/** Default gas limit for unknown actions */\nconst DEFAULT_GAS_LIMIT = 200_000;\n\n/** Approximate ETH/USD rate for USDC conversion baseline */\nconst ETH_USD_BASELINE = 3000;\n\n/**\n * Gas abstraction for Invariance operations.\n *\n * Provides gas estimation and balance checking with support for\n * USDC-based gas abstraction (where users pay gas fees in USDC\n * instead of ETH).\n *\n * @example\n * ```typescript\n * const estimate = await inv.gas.estimate({ action: 'swap' });\n * console.log(estimate.usdcCost);\n *\n * const balance = await inv.gas.balance();\n * console.log(balance.canAbstract);\n * ```\n */\nexport class GasManager {\n private readonly contracts: ContractFactory;\n private readonly telemetry: Telemetry;\n\n constructor(\n contracts: ContractFactory,\n _events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ) {\n this.contracts = contracts;\n this.telemetry = telemetry;\n }\n\n /**\n * Estimate gas cost for an action.\n *\n * Returns both ETH and USDC costs based on the current gas strategy.\n *\n * @param opts - Action details for gas estimation\n * @returns Gas estimate with ETH and USDC costs\n */\n async estimate(opts: EstimateGasOptions): Promise<GasEstimate> {\n this.telemetry.track('gas.estimate', { action: opts.action });\n\n const publicClient = this.contracts.getPublicClient();\n const strategy = this.contracts.getGasStrategy();\n\n // Get current gas price from RPC\n const gasPrice = await publicClient.getGasPrice();\n\n // Look up gas limit for the action\n const gasLimit = GAS_LIMITS[opts.action] ?? DEFAULT_GAS_LIMIT;\n\n // Calculate ETH cost: gasLimit * gasPrice (in wei)\n const ethCostWei = BigInt(gasLimit) * gasPrice;\n const ethCost = formatEther(ethCostWei);\n\n // Convert to USDC at baseline rate\n const ethCostNum = parseFloat(ethCost);\n const usdcCost = (ethCostNum * ETH_USD_BASELINE).toFixed(6);\n\n return {\n ethCost,\n usdcCost,\n gasLimit,\n gasPrice: gasPrice.toString(),\n strategy,\n };\n }\n\n /**\n * Sponsor a user operation via Coinbase Paymaster on Base.\n *\n * Sends the user operation to the paymaster endpoint for gas sponsorship.\n * Requires `PAYMASTER_URL` and `PAYMASTER_API_KEY` environment variables.\n *\n * @param userOp - The user operation to sponsor\n * @returns The sponsored user operation with paymaster fields filled in\n */\n async sponsorUserOperation(userOp: {\n sender: string;\n nonce: string;\n callData: string;\n callGasLimit: string;\n verificationGasLimit: string;\n preVerificationGas: string;\n maxFeePerGas: string;\n maxPriorityFeePerGas: string;\n }): Promise<{\n paymasterAndData: string;\n callGasLimit: string;\n verificationGasLimit: string;\n preVerificationGas: string;\n }> {\n this.telemetry.track('gas.sponsor');\n\n const paymasterUrl = process.env['PAYMASTER_URL'];\n const apiKey = process.env['PAYMASTER_API_KEY'];\n\n if (!paymasterUrl || !apiKey) {\n throw new Error('PAYMASTER_URL and PAYMASTER_API_KEY environment variables are required for gas sponsorship');\n }\n\n const response = await fetch(paymasterUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'pm_sponsorUserOperation',\n params: [userOp, { chainId: '0x2105' }], // Base mainnet\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Paymaster request failed: ${response.status}`);\n }\n\n const json = await response.json() as {\n result?: {\n paymasterAndData: string;\n callGasLimit: string;\n verificationGasLimit: string;\n preVerificationGas: string;\n };\n error?: { message: string };\n };\n\n if (json.error) {\n throw new Error(`Paymaster error: ${json.error.message}`);\n }\n\n if (!json.result) {\n throw new Error('Paymaster returned empty result');\n }\n\n return json.result;\n }\n\n /**\n * Get gas-related balances for the current wallet.\n *\n * Returns ETH and USDC balances and whether gas abstraction\n * is available (requires sufficient USDC and abstracted strategy).\n *\n * @returns Gas balance information\n */\n async balance(): Promise<GasBalance> {\n this.telemetry.track('gas.balance');\n\n const publicClient = this.contracts.getPublicClient();\n const strategy = this.contracts.getGasStrategy();\n const walletAddress = this.contracts.getWalletAddress() as `0x${string}`;\n\n // Get ETH balance\n const ethBalanceWei = await publicClient.getBalance({ address: walletAddress });\n const ethBalance = formatEther(ethBalanceWei);\n\n // Get USDC balance\n let usdcBalance = '0.00';\n try {\n const usdcContract = this.contracts.getContract('mockUsdc');\n const balanceOfFn = usdcContract.read['balanceOf'];\n if (balanceOfFn) {\n const rawBalance = await balanceOfFn([walletAddress]) as bigint;\n // USDC has 6 decimals\n usdcBalance = (Number(rawBalance) / 1_000_000).toFixed(6);\n }\n } catch {\n // USDC contract may not be available\n }\n\n // Can abstract gas if strategy is abstracted AND USDC balance is sufficient\n const hasUsdc = parseFloat(usdcBalance) > 0;\n const canAbstract = strategy === 'abstracted' && hasUsdc;\n\n return {\n ethBalance,\n usdcBalance,\n canAbstract,\n };\n }\n}\n","/**\n * Standalone ERC-8004 (Trustless Agents) manager.\n *\n * NO dependency on ContractFactory, EventEmitter, or Telemetry.\n * Takes raw viem PublicClient + optional WalletClient directly.\n * Can be used without any Invariance infrastructure.\n *\n * @example\n * ```typescript\n * import { createPublicClient, http } from 'viem';\n * import { base } from 'viem/chains';\n * import { ERC8004Manager } from '@invariance/sdk';\n *\n * const publicClient = createPublicClient({ chain: base, transport: http() });\n * const manager = new ERC8004Manager({ chainId: 8453, publicClient });\n *\n * const agent = await manager.getAgent(1n);\n * const summary = await manager.getSummary(1n);\n * ```\n */\n\nimport { getContract as viemGetContract } from 'viem';\nimport type { PublicClient, WalletClient } from 'viem';\nimport { ERC8004IdentityRegistryAbi, ERC8004ReputationRegistryAbi, ERC8004ValidationRegistryAbi } from './abis.js';\nimport { getERC8004Addresses } from './addresses.js';\nimport type {\n ERC8004Config,\n ERC8004RegistryAddresses,\n ERC8004AgentIdentity,\n ERC8004Metadata,\n GiveFeedbackOptions,\n ERC8004Feedback,\n ERC8004ReputationSummary,\n ReputationSummaryFilterOptions,\n ValidationRequestOptions,\n ValidationResponseOptions,\n ERC8004ValidationStatus,\n ERC8004ValidationSummary,\n ValidationSummaryFilterOptions,\n} from './types.js';\n\n/** Transaction receipt returned by write methods */\ninterface TxReceipt {\n txHash: string;\n blockNumber: number;\n status: 'success' | 'reverted';\n}\n\n/** Simplified contract interface for internal use */\ninterface ContractInstance {\n address: `0x${string}`;\n abi: readonly unknown[];\n read: Record<string, ((...args: unknown[]) => Promise<unknown>) | undefined>;\n write: Record<string, ((...args: unknown[]) => Promise<`0x${string}`>) | undefined>;\n}\n\nexport class ERC8004Manager {\n private readonly chainId: number;\n private readonly publicClient: PublicClient;\n private readonly walletClient: WalletClient | undefined;\n private readonly registryAddresses: ERC8004RegistryAddresses;\n\n private readonly identityContract: ContractInstance;\n private readonly reputationContract: ContractInstance;\n private readonly validationContract: ContractInstance;\n\n constructor(config: ERC8004Config) {\n this.chainId = config.chainId;\n this.publicClient = config.publicClient as PublicClient;\n this.walletClient = config.walletClient as WalletClient | undefined;\n\n // Resolve registry addresses\n const addresses = config.registryAddresses ?? getERC8004Addresses(config.chainId);\n if (!addresses) {\n throw new ERC8004Error(\n 'ERC8004_NOT_DEPLOYED',\n `ERC-8004 registries are not deployed on chain ${config.chainId}. Provide registryAddresses in config.`,\n );\n }\n this.registryAddresses = addresses;\n\n // Create contract instances\n const client = this.walletClient\n ? { public: this.publicClient, wallet: this.walletClient }\n : { public: this.publicClient };\n\n this.identityContract = viemGetContract({\n address: addresses.identity,\n abi: ERC8004IdentityRegistryAbi,\n client,\n }) as unknown as ContractInstance;\n\n this.reputationContract = viemGetContract({\n address: addresses.reputation,\n abi: ERC8004ReputationRegistryAbi,\n client,\n }) as unknown as ContractInstance;\n\n this.validationContract = viemGetContract({\n address: addresses.validation,\n abi: ERC8004ValidationRegistryAbi,\n client,\n }) as unknown as ContractInstance;\n }\n\n // ===========================================================================\n // Identity Methods\n // ===========================================================================\n\n /**\n * Register a new agent identity in the ERC-8004 Identity Registry.\n *\n * @param agentURI - Off-chain metadata URI for the agent\n * @param metadata - Optional initial metadata key-value pairs\n * @returns The registered agent identity\n */\n async register(agentURI: string, metadata?: ERC8004Metadata[]): Promise<ERC8004AgentIdentity> {\n this.requireWalletClient();\n\n const registerFn = this.getWriteFn(this.identityContract, 'register');\n const txHash = await registerFn([agentURI]);\n const receipt = await this.publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Parse agent ID from AgentRegistered event\n const agentId = this.parseAgentIdFromLogs(receipt.logs);\n\n // Set metadata if provided\n if (metadata && metadata.length > 0) {\n const setMetaFn = this.getWriteFn(this.identityContract, 'setMetadata');\n for (const { key, value } of metadata) {\n await setMetaFn([agentId, key, value]);\n }\n }\n\n const wallet = await this.getReadFn(this.identityContract, 'getAgentWallet')([agentId]) as `0x${string}`;\n\n return {\n agentId,\n agentURI,\n wallet,\n globalId: this.computeGlobalId(agentId),\n metadata: metadata ?? [],\n };\n }\n\n /**\n * Get an agent identity by ID.\n *\n * @param agentId - The on-chain agent ID\n * @returns The agent identity\n */\n async getAgent(agentId: bigint): Promise<ERC8004AgentIdentity> {\n const agentURI = await this.getReadFn(this.identityContract, 'agentURI')([agentId]) as string;\n\n if (!agentURI) {\n throw new ERC8004Error(\n 'ERC8004_AGENT_NOT_FOUND',\n `Agent ${agentId} not found in the Identity Registry.`,\n );\n }\n\n const wallet = await this.getReadFn(this.identityContract, 'getAgentWallet')([agentId]) as `0x${string}`;\n\n return {\n agentId,\n agentURI,\n wallet,\n globalId: this.computeGlobalId(agentId),\n metadata: [],\n };\n }\n\n /**\n * Set a metadata value on an agent identity.\n *\n * @param agentId - The agent ID\n * @param key - Metadata key\n * @param value - Metadata value\n * @returns Transaction receipt\n */\n async setMetadata(agentId: bigint, key: string, value: string): Promise<TxReceipt> {\n this.requireWalletClient();\n const txHash = await this.getWriteFn(this.identityContract, 'setMetadata')([agentId, key, value]);\n return this.waitForTxReceipt(txHash);\n }\n\n /**\n * Get a metadata value from an agent identity.\n *\n * @param agentId - The agent ID\n * @param key - Metadata key\n * @returns The metadata value\n */\n async getMetadata(agentId: bigint, key: string): Promise<string> {\n return this.getReadFn(this.identityContract, 'getMetadata')([agentId, key]) as Promise<string>;\n }\n\n /**\n * Set the wallet address for an agent (with signature authorization).\n *\n * @param agentId - The agent ID\n * @param newWallet - New wallet address\n * @param deadline - Signature deadline timestamp\n * @param signature - Authorization signature\n * @returns Transaction receipt\n */\n async setAgentWallet(agentId: bigint, newWallet: `0x${string}`, deadline: bigint, signature: `0x${string}`): Promise<TxReceipt> {\n this.requireWalletClient();\n const txHash = await this.getWriteFn(this.identityContract, 'setAgentWallet')([agentId, newWallet, deadline, signature]);\n return this.waitForTxReceipt(txHash);\n }\n\n /**\n * Set the agent URI.\n *\n * @param agentId - The agent ID\n * @param newURI - New agent URI\n * @returns Transaction receipt\n */\n async setAgentURI(agentId: bigint, newURI: string): Promise<TxReceipt> {\n this.requireWalletClient();\n const txHash = await this.getWriteFn(this.identityContract, 'setAgentURI')([agentId, newURI]);\n return this.waitForTxReceipt(txHash);\n }\n\n /**\n * Compute the cross-chain global ID for an agent.\n *\n * @param agentId - The on-chain agent ID\n * @returns The global ID string: eip155:{chainId}:{registryAddress}:{agentId}\n */\n getGlobalId(agentId: bigint): string {\n return this.computeGlobalId(agentId);\n }\n\n // ===========================================================================\n // Reputation Methods\n // ===========================================================================\n\n /**\n * Give feedback on an agent.\n *\n * @param opts - Feedback options\n * @returns Transaction receipt\n */\n async giveFeedback(opts: GiveFeedbackOptions): Promise<TxReceipt> {\n this.requireWalletClient();\n const txHash = await this.getWriteFn(this.reputationContract, 'giveFeedback')([\n opts.agentId,\n opts.value,\n opts.tag1,\n opts.tag2 ?? '',\n opts.feedbackURI ?? '',\n ]);\n return this.waitForTxReceipt(txHash);\n }\n\n /**\n * Revoke previously given feedback.\n *\n * @param agentId - The agent ID\n * @param feedbackIndex - Index of the feedback to revoke\n * @returns Transaction receipt\n */\n async revokeFeedback(agentId: bigint, feedbackIndex: bigint): Promise<TxReceipt> {\n this.requireWalletClient();\n const txHash = await this.getWriteFn(this.reputationContract, 'revokeFeedback')([agentId, feedbackIndex]);\n return this.waitForTxReceipt(txHash);\n }\n\n /**\n * Get reputation summary for an agent.\n *\n * @param agentId - The agent ID\n * @param _opts - Optional filter options (reserved for future use)\n * @returns Reputation summary\n */\n async getSummary(agentId: bigint, _opts?: ReputationSummaryFilterOptions): Promise<ERC8004ReputationSummary> {\n const result = await this.getReadFn(this.reputationContract, 'getSummary')([agentId]) as [bigint, bigint, number];\n return {\n count: Number(result[0]),\n summaryValue: Number(result[1]),\n decimals: result[2],\n };\n }\n\n /**\n * Read a single feedback entry.\n *\n * @param agentId - The agent ID\n * @param client - The client address who gave the feedback\n * @param index - Feedback index for this client\n * @returns The feedback entry\n */\n async readFeedback(agentId: bigint, client: `0x${string}`, index: bigint): Promise<ERC8004Feedback> {\n const result = await this.getReadFn(this.reputationContract, 'readFeedback')([agentId, client, index]) as [number, string, string, string, bigint];\n return {\n client,\n value: result[0],\n tag1: result[1],\n tag2: result[2],\n feedbackURI: result[3],\n timestamp: Number(result[4]),\n };\n }\n\n /**\n * Read all feedback entries for an agent.\n *\n * @param agentId - The agent ID\n * @returns All feedback entries\n */\n async readAllFeedback(agentId: bigint): Promise<ERC8004Feedback[]> {\n const result = await this.getReadFn(this.reputationContract, 'readAllFeedback')([agentId]) as Array<{\n client: `0x${string}`;\n value: number;\n tag1: string;\n tag2: string;\n feedbackURI: string;\n timestamp: bigint;\n }>;\n return result.map((f) => ({\n client: f.client,\n value: f.value,\n tag1: f.tag1,\n tag2: f.tag2,\n feedbackURI: f.feedbackURI,\n timestamp: Number(f.timestamp),\n }));\n }\n\n // ===========================================================================\n // Validation Methods\n // ===========================================================================\n\n /**\n * Submit a validation request for an agent.\n *\n * @param opts - Validation request options\n * @returns Transaction receipt\n */\n async requestValidation(opts: ValidationRequestOptions): Promise<TxReceipt> {\n this.requireWalletClient();\n const txHash = await this.getWriteFn(this.validationContract, 'validationRequest')([\n opts.agentId,\n opts.validator,\n opts.requestURI,\n ]);\n return this.waitForTxReceipt(txHash);\n }\n\n /**\n * Respond to a validation request.\n *\n * @param opts - Validation response options\n * @returns Transaction receipt\n */\n async respondToValidation(opts: ValidationResponseOptions): Promise<TxReceipt> {\n this.requireWalletClient();\n const txHash = await this.getWriteFn(this.validationContract, 'validationResponse')([\n opts.requestHash,\n opts.response,\n opts.responseURI ?? '',\n ]);\n return this.waitForTxReceipt(txHash);\n }\n\n /**\n * Get the status of a validation request.\n *\n * @param requestHash - The validation request hash\n * @returns Validation status\n */\n async getValidationStatus(requestHash: `0x${string}`): Promise<ERC8004ValidationStatus> {\n const result = await this.getReadFn(this.validationContract, 'getValidationStatus')([requestHash]) as [bigint, `0x${string}`, string, number, string, boolean];\n return {\n requestHash,\n agentId: result[0],\n validator: result[1],\n requestURI: result[2],\n response: result[3],\n responseURI: result[4],\n completed: result[5],\n };\n }\n\n /**\n * Get validation summary for an agent.\n *\n * @param agentId - The agent ID\n * @param _opts - Optional filter options (reserved for future use)\n * @returns Validation summary\n */\n async getValidationSummary(agentId: bigint, _opts?: ValidationSummaryFilterOptions): Promise<ERC8004ValidationSummary> {\n const result = await this.getReadFn(this.validationContract, 'getSummary')([agentId]) as [bigint, bigint];\n return {\n count: Number(result[0]),\n avgResponse: Number(result[1]),\n };\n }\n\n // ===========================================================================\n // Internal Helpers\n // ===========================================================================\n\n /** Get a read function from a contract, throwing if not found */\n private getReadFn(contract: ContractInstance, name: string): (...args: unknown[]) => Promise<unknown> {\n const fn = contract.read[name];\n if (!fn) {\n throw new ERC8004Error('ERC8004_NOT_DEPLOYED', `Contract read function \"${name}\" not found.`);\n }\n return fn;\n }\n\n /** Get a write function from a contract, throwing if not found */\n private getWriteFn(contract: ContractInstance, name: string): (...args: unknown[]) => Promise<`0x${string}`> {\n const fn = contract.write[name];\n if (!fn) {\n throw new ERC8004Error('ERC8004_NOT_DEPLOYED', `Contract write function \"${name}\" not found.`);\n }\n return fn;\n }\n\n /** Ensure walletClient is available for write operations */\n private requireWalletClient(): void {\n if (!this.walletClient) {\n throw new ERC8004Error(\n 'ERC8004_NOT_DEPLOYED',\n 'A WalletClient is required for write operations. Provide walletClient in config.',\n );\n }\n }\n\n /** Compute the global ID for an agent */\n private computeGlobalId(agentId: bigint): string {\n return `eip155:${this.chainId}:${this.registryAddresses.identity}:${agentId}`;\n }\n\n /** Wait for a transaction receipt and return a simplified result */\n private async waitForTxReceipt(txHash: `0x${string}`): Promise<TxReceipt> {\n const receipt = await this.publicClient.waitForTransactionReceipt({ hash: txHash });\n return {\n txHash: receipt.transactionHash,\n blockNumber: Number(receipt.blockNumber),\n status: receipt.status,\n };\n }\n\n /** Parse agent ID from registration event logs */\n private parseAgentIdFromLogs(logs: readonly { topics: readonly string[]; data: string }[]): bigint {\n // AgentRegistered event: topic[0] is event sig, topic[1] is indexed agentId\n for (const log of logs) {\n if (log.topics.length >= 2 && log.topics[1]) {\n return BigInt(log.topics[1]);\n }\n }\n throw new ERC8004Error(\n 'ERC8004_AGENT_NOT_FOUND',\n 'Failed to parse agent ID from transaction logs.',\n );\n }\n}\n\n/**\n * Error class for ERC-8004 operations.\n * Standalone — does not extend InvarianceError.\n */\nexport class ERC8004Error extends Error {\n public readonly code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.name = 'ERC8004Error';\n this.code = code;\n }\n}\n","/**\n * Minimal viem-compatible ABIs for the three ERC-8004 registry contracts.\n *\n * Only includes functions that the SDK calls. Sourced from the\n * ERC-8004 reference implementation.\n */\n\n/** ABI for the ERC-8004 Identity Registry */\nexport const ERC8004IdentityRegistryAbi = [\n {\n type: 'function',\n name: 'register',\n inputs: [\n { name: 'agentURI', type: 'string', internalType: 'string' },\n ],\n outputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'getMetadata',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n { name: 'key', type: 'string', internalType: 'string' },\n ],\n outputs: [\n { name: 'value', type: 'string', internalType: 'string' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'setMetadata',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n { name: 'key', type: 'string', internalType: 'string' },\n { name: 'value', type: 'string', internalType: 'string' },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'setAgentWallet',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n { name: 'newWallet', type: 'address', internalType: 'address' },\n { name: 'deadline', type: 'uint256', internalType: 'uint256' },\n { name: 'signature', type: 'bytes', internalType: 'bytes' },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'getAgentWallet',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n ],\n outputs: [\n { name: 'wallet', type: 'address', internalType: 'address' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'setAgentURI',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n { name: 'agentURI', type: 'string', internalType: 'string' },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'agentURI',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n ],\n outputs: [\n { name: '', type: 'string', internalType: 'string' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'event',\n name: 'AgentRegistered',\n inputs: [\n { name: 'agentId', type: 'uint256', indexed: true, internalType: 'uint256' },\n { name: 'owner', type: 'address', indexed: true, internalType: 'address' },\n { name: 'agentURI', type: 'string', indexed: false, internalType: 'string' },\n ],\n },\n] as const;\n\n/** ABI for the ERC-8004 Reputation Registry */\nexport const ERC8004ReputationRegistryAbi = [\n {\n type: 'function',\n name: 'giveFeedback',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n { name: 'value', type: 'uint8', internalType: 'uint8' },\n { name: 'tag1', type: 'string', internalType: 'string' },\n { name: 'tag2', type: 'string', internalType: 'string' },\n { name: 'feedbackURI', type: 'string', internalType: 'string' },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'revokeFeedback',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n { name: 'feedbackIndex', type: 'uint256', internalType: 'uint256' },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'getSummary',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n ],\n outputs: [\n { name: 'count', type: 'uint256', internalType: 'uint256' },\n { name: 'summaryValue', type: 'uint256', internalType: 'uint256' },\n { name: 'decimals', type: 'uint8', internalType: 'uint8' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'readFeedback',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n { name: 'client', type: 'address', internalType: 'address' },\n { name: 'index', type: 'uint256', internalType: 'uint256' },\n ],\n outputs: [\n { name: 'value', type: 'uint8', internalType: 'uint8' },\n { name: 'tag1', type: 'string', internalType: 'string' },\n { name: 'tag2', type: 'string', internalType: 'string' },\n { name: 'feedbackURI', type: 'string', internalType: 'string' },\n { name: 'timestamp', type: 'uint256', internalType: 'uint256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'readAllFeedback',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n ],\n outputs: [\n {\n name: '',\n type: 'tuple[]',\n internalType: 'struct IReputationRegistry.Feedback[]',\n components: [\n { name: 'client', type: 'address', internalType: 'address' },\n { name: 'value', type: 'uint8', internalType: 'uint8' },\n { name: 'tag1', type: 'string', internalType: 'string' },\n { name: 'tag2', type: 'string', internalType: 'string' },\n { name: 'feedbackURI', type: 'string', internalType: 'string' },\n { name: 'timestamp', type: 'uint256', internalType: 'uint256' },\n ],\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getClients',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n ],\n outputs: [\n { name: '', type: 'address[]', internalType: 'address[]' },\n ],\n stateMutability: 'view',\n },\n] as const;\n\n/** ABI for the ERC-8004 Validation Registry */\nexport const ERC8004ValidationRegistryAbi = [\n {\n type: 'function',\n name: 'validationRequest',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n { name: 'validator', type: 'address', internalType: 'address' },\n { name: 'requestURI', type: 'string', internalType: 'string' },\n ],\n outputs: [\n { name: 'requestHash', type: 'bytes32', internalType: 'bytes32' },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'validationResponse',\n inputs: [\n { name: 'requestHash', type: 'bytes32', internalType: 'bytes32' },\n { name: 'response', type: 'uint8', internalType: 'uint8' },\n { name: 'responseURI', type: 'string', internalType: 'string' },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'getValidationStatus',\n inputs: [\n { name: 'requestHash', type: 'bytes32', internalType: 'bytes32' },\n ],\n outputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n { name: 'validator', type: 'address', internalType: 'address' },\n { name: 'requestURI', type: 'string', internalType: 'string' },\n { name: 'response', type: 'uint8', internalType: 'uint8' },\n { name: 'responseURI', type: 'string', internalType: 'string' },\n { name: 'completed', type: 'bool', internalType: 'bool' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getSummary',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n ],\n outputs: [\n { name: 'count', type: 'uint256', internalType: 'uint256' },\n { name: 'avgResponse', type: 'uint256', internalType: 'uint256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getAgentValidations',\n inputs: [\n { name: 'agentId', type: 'uint256', internalType: 'uint256' },\n ],\n outputs: [\n { name: '', type: 'bytes32[]', internalType: 'bytes32[]' },\n ],\n stateMutability: 'view',\n },\n] as const;\n","/**\n * Canonical ERC-8004 registry addresses per chain.\n *\n * **IMPORTANT — Testnet placeholders only.**\n * The addresses below are synthetic pre-deployment values (sequential hex pattern).\n * They do NOT correspond to deployed contracts. Before using ERC-8004 features in\n * production, you **must** override these with real deployed addresses via\n * `Invariance({ erc8004: { addresses: { identity, reputation, validation } } })`.\n *\n * @todo Replace with actual deployed contract addresses after ERC-8004 registry deployment.\n */\n\nimport type { ERC8004RegistryAddresses } from './types.js';\n\n/** Known ERC-8004 registry addresses by chain ID */\nexport const ERC8004_REGISTRY_ADDRESSES: Record<number, ERC8004RegistryAddresses> = {\n // Ethereum mainnet\n 1: {\n identity: '0x1A2b3C4d5E6f7A8b9C0D1e2F3a4B5c6D7E8f9A0b' as `0x${string}`,\n reputation: '0x2B3c4D5e6F7a8B9c0D1E2f3A4b5C6d7E8F9a0B1c' as `0x${string}`,\n validation: '0x3C4d5E6f7A8b9C0d1E2F3a4B5c6D7e8F9A0b1C2d' as `0x${string}`,\n },\n // Base mainnet\n 8453: {\n identity: '0x4D5e6F7a8B9c0D1e2F3A4b5C6d7E8f9A0B1c2D3e' as `0x${string}`,\n reputation: '0x5E6f7A8b9C0d1E2F3a4B5c6D7e8F9a0B1C2d3E4f' as `0x${string}`,\n validation: '0x6F7a8B9c0D1e2F3A4b5C6d7E8f9A0b1C2D3e4F5a' as `0x${string}`,\n },\n // Base Sepolia\n 84532: {\n identity: '0x7A8b9C0d1E2f3A4B5c6D7e8F9a0B1c2D3E4f5A6b' as `0x${string}`,\n reputation: '0x8B9c0D1e2F3a4B5C6d7E8f9A0b1C2d3E4F5a6B7c' as `0x${string}`,\n validation: '0x9C0d1E2f3A4b5C6D7e8F9a0B1c2D3e4F5A6b7C8d' as `0x${string}`,\n },\n};\n\n/**\n * Get ERC-8004 registry addresses for a given chain.\n *\n * @param chainId - The chain ID\n * @returns Registry addresses or undefined if not supported\n */\nexport function getERC8004Addresses(chainId: number): ERC8004RegistryAddresses | undefined {\n return ERC8004_REGISTRY_ADDRESSES[chainId];\n}\n\n/**\n * Check if ERC-8004 is supported on a given chain.\n *\n * @param chainId - The chain ID\n * @returns Whether ERC-8004 registries are deployed on this chain\n */\nexport function isERC8004Supported(chainId: number): boolean {\n return chainId in ERC8004_REGISTRY_ADDRESSES;\n}\n","/**\n * Optional bridge between ERC-8004 and Invariance modules.\n *\n * Takes an ERC8004Manager instance + Invariance module references.\n * Explicitly constructed — never automatic.\n *\n * @example\n * ```typescript\n * const inv = new Invariance({ chain: 'base', signer: wallet });\n * const bridge = inv.erc8004Bridge;\n *\n * // Link identities\n * const linked = await bridge.linkIdentity('inv-id-123', 42n);\n *\n * // Pull external reputation\n * const signal = await bridge.pullERC8004Reputation(42n);\n * ```\n */\n\nimport type { ERC8004Manager } from './ERC8004Manager.js';\nimport type { IdentityManager } from '../identity/IdentityManager.js';\nimport type { EventLedger } from '../ledger/EventLedger.js';\nimport type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport type {\n LinkedIdentity,\n ExternalReputationSignal,\n PushFeedbackOptions,\n} from './types.js';\n\n/** Transaction receipt returned by bridge write methods */\ninterface TxReceipt {\n txHash: string;\n blockNumber: number;\n status: 'success' | 'reverted';\n}\n\nexport class InvarianceBridge {\n private readonly erc8004: ERC8004Manager;\n private readonly identity: IdentityManager;\n private readonly ledger: EventLedger;\n private readonly contracts: ContractFactory;\n private readonly events: InvarianceEventEmitter;\n private readonly telemetry: Telemetry;\n\n /** In-memory cache of linked identities */\n private linkedIdentities: Map<string, LinkedIdentity> = new Map();\n private static readonly MAX_LINKED_IDENTITIES = 1000;\n\n constructor(\n erc8004: ERC8004Manager,\n identity: IdentityManager,\n ledger: EventLedger,\n contracts: ContractFactory,\n events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ) {\n this.erc8004 = erc8004;\n this.identity = identity;\n this.ledger = ledger;\n this.contracts = contracts;\n this.events = events;\n this.telemetry = telemetry;\n }\n\n // ===========================================================================\n // Identity Linking\n // ===========================================================================\n\n /**\n * Link an Invariance identity to an ERC-8004 agent identity.\n *\n * Sets `invariance-identity-id` as ERC-8004 metadata AND creates\n * an Invariance attestation with `erc8004-agent-id` claim.\n *\n * @param invarianceIdentityId - Invariance identity ID\n * @param erc8004AgentId - ERC-8004 agent ID\n * @returns The linked identity pairing\n */\n async linkIdentity(invarianceIdentityId: string, erc8004AgentId: bigint): Promise<LinkedIdentity> {\n this.telemetry.track('erc8004.linkIdentity');\n\n // Set Invariance identity ID as ERC-8004 metadata\n const metadataReceipt = await this.erc8004.setMetadata(\n erc8004AgentId,\n 'invariance-identity-id',\n invarianceIdentityId,\n );\n\n // Create Invariance attestation linking to ERC-8004\n const globalId = this.erc8004.getGlobalId(erc8004AgentId);\n const walletAddress = this.contracts.getWalletAddress();\n await this.identity.attest(invarianceIdentityId, {\n claim: 'erc8004-agent-id',\n attester: walletAddress,\n evidence: erc8004AgentId.toString(),\n });\n\n const linked: LinkedIdentity = {\n invarianceIdentityId,\n erc8004AgentId: erc8004AgentId.toString(),\n erc8004GlobalId: globalId,\n linkedAt: Date.now(),\n txHash: metadataReceipt.txHash,\n };\n\n // Cache the link\n if (this.linkedIdentities.size >= InvarianceBridge.MAX_LINKED_IDENTITIES) {\n const oldest = this.linkedIdentities.keys().next().value;\n if (oldest !== undefined) this.linkedIdentities.delete(oldest);\n }\n this.linkedIdentities.set(invarianceIdentityId, linked);\n\n this.events.emit('erc8004.identity.linked', {\n invarianceIdentityId,\n erc8004AgentId: erc8004AgentId.toString(),\n });\n\n return linked;\n }\n\n /**\n * Get a linked identity pairing.\n *\n * Checks local cache first, then queries ERC-8004 metadata.\n *\n * @param invarianceIdentityId - Invariance identity ID\n * @returns The linked identity or null if not linked\n */\n async getLinkedIdentity(invarianceIdentityId: string): Promise<LinkedIdentity | null> {\n this.telemetry.track('erc8004.getLinkedIdentity');\n\n // Check local cache\n const cached = this.linkedIdentities.get(invarianceIdentityId);\n if (cached) return cached;\n\n return null;\n }\n\n /**\n * Unlink an Invariance identity from its ERC-8004 agent.\n *\n * Removes the ERC-8004 metadata and clears the local cache.\n *\n * @param invarianceIdentityId - Invariance identity ID\n */\n async unlinkIdentity(invarianceIdentityId: string): Promise<void> {\n this.telemetry.track('erc8004.unlinkIdentity');\n\n const linked = this.linkedIdentities.get(invarianceIdentityId);\n if (!linked) return;\n\n const erc8004AgentId = BigInt(linked.erc8004AgentId);\n\n // Clear ERC-8004 metadata\n await this.erc8004.setMetadata(erc8004AgentId, 'invariance-identity-id', '');\n\n // Remove from cache\n this.linkedIdentities.delete(invarianceIdentityId);\n\n this.events.emit('erc8004.identity.unlinked', {\n invarianceIdentityId,\n erc8004AgentId: linked.erc8004AgentId,\n });\n }\n\n // ===========================================================================\n // Reputation Bridging\n // ===========================================================================\n\n /**\n * Pull ERC-8004 reputation data and normalize to a 0-100 score.\n *\n * Does NOT modify Invariance scoring — caller decides how to use the signal.\n *\n * @param erc8004AgentId - ERC-8004 agent ID\n * @returns External reputation signal with normalized score\n */\n async pullERC8004Reputation(erc8004AgentId: bigint): Promise<ExternalReputationSignal> {\n this.telemetry.track('erc8004.pullReputation');\n\n const summary = await this.erc8004.getSummary(erc8004AgentId);\n\n // Normalize: assume summaryValue is on a scale determined by decimals\n // e.g., summaryValue=350 with decimals=2 means 3.50 out of 5.00\n const rawValue = summary.decimals > 0\n ? summary.summaryValue / Math.pow(10, summary.decimals)\n : summary.summaryValue;\n\n // Normalize to 0-100 scale (assuming max raw value is 5)\n const maxScale = 5;\n const normalizedScore = Math.min(100, Math.max(0, (rawValue / maxScale) * 100));\n\n return {\n source: 'erc8004',\n feedbackCount: summary.count,\n averageValue: rawValue,\n normalizedScore: Math.round(normalizedScore * 100) / 100,\n };\n }\n\n /**\n * Push Invariance ledger data as ERC-8004 feedback.\n *\n * Queries Invariance ledger entries for the identity, derives a\n * feedback value (based on success rate), and calls giveFeedback()\n * on the ERC-8004 Reputation Registry.\n *\n * @param invarianceIdentityId - Invariance identity ID\n * @param erc8004AgentId - ERC-8004 agent ID to give feedback on\n * @param opts - Feedback options (tags, lookback, URI)\n * @returns Transaction receipt\n */\n async pushFeedbackFromLedger(\n invarianceIdentityId: string,\n erc8004AgentId: bigint,\n opts: PushFeedbackOptions,\n ): Promise<TxReceipt> {\n this.telemetry.track('erc8004.pushFeedback');\n\n // Query Invariance ledger for this identity's entries\n const fromTimestamp = opts.lookbackMs\n ? Date.now() - opts.lookbackMs\n : 0;\n\n const entries = await this.ledger.query({\n actor: invarianceIdentityId,\n from: fromTimestamp,\n limit: 1000,\n });\n\n // Derive feedback value from ledger entries (1-5 scale)\n // Based on the ratio of successful entries\n const total = entries.length;\n const successful = entries.filter(\n (e: { category?: string }) => e.category !== 'error' && e.category !== 'violation',\n ).length;\n\n const successRate = total > 0 ? successful / total : 0;\n // Map success rate to 1-5 scale\n const feedbackValue = Math.max(1, Math.min(5, Math.round(successRate * 5)));\n\n const receipt = await this.erc8004.giveFeedback({\n agentId: erc8004AgentId,\n value: feedbackValue,\n tag1: opts.tag1,\n tag2: opts.tag2 ?? '',\n feedbackURI: opts.feedbackURI ?? '',\n });\n\n this.events.emit('erc8004.feedback.pushed', {\n erc8004AgentId: erc8004AgentId.toString(),\n value: feedbackValue,\n });\n\n return receipt;\n }\n\n // ===========================================================================\n // Validation Bridging\n // ===========================================================================\n\n /**\n * Act as a validator for an ERC-8004 agent.\n *\n * Reads Invariance execution logs, evaluates integrity,\n * and submits a validation response.\n *\n * @param erc8004AgentId - ERC-8004 agent ID being validated\n * @param requestHash - Hash of the validation request to respond to\n * @returns Transaction receipt\n */\n async actAsValidator(erc8004AgentId: bigint, requestHash: `0x${string}`): Promise<TxReceipt> {\n this.telemetry.track('erc8004.actAsValidator');\n\n // Find the linked Invariance identity for this ERC-8004 agent\n let invarianceIdentityId: string | null = null;\n for (const [invId, link] of this.linkedIdentities.entries()) {\n if (link.erc8004AgentId === erc8004AgentId.toString()) {\n invarianceIdentityId = invId;\n break;\n }\n }\n\n // Evaluate based on Invariance data if identity is linked\n let responseValue = 1; // Default: valid\n if (invarianceIdentityId) {\n const entries = await this.ledger.query({\n actor: invarianceIdentityId,\n limit: 100,\n });\n\n const total = entries.length;\n const violations = entries.filter(\n (e: { category?: string }) => e.category === 'violation' || e.category === 'error',\n ).length;\n\n const complianceRate = total > 0 ? (total - violations) / total : 1;\n responseValue = complianceRate >= 0.9 ? 1 : 0;\n }\n\n const receipt = await this.erc8004.respondToValidation({\n requestHash,\n response: responseValue,\n });\n\n this.events.emit('erc8004.validation.responded', {\n requestHash,\n response: responseValue,\n });\n\n return receipt;\n }\n\n /**\n * Submit a validation request targeting Invariance as validator.\n *\n * @param erc8004AgentId - ERC-8004 agent ID to validate\n * @param requestURI - URI describing what to validate\n * @returns Transaction receipt\n */\n async requestInvarianceValidation(erc8004AgentId: bigint, requestURI: string): Promise<TxReceipt> {\n this.telemetry.track('erc8004.requestValidation');\n\n const walletAddress = this.contracts.getWalletAddress() as `0x${string}`;\n\n return this.erc8004.requestValidation({\n agentId: erc8004AgentId,\n validator: walletAddress,\n requestURI,\n });\n }\n}\n","import type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport { ErrorCode } from '@invariance/common';\nimport type { ReputationScore, ReviewSummary } from '@invariance/common';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport {\n toBytes32,\n fromBytes32,\n waitForReceipt,\n mapContractError,\n listingCategoryToEnum,\n enumToListingCategory,\n pricingTypeToEnum,\n enumToPricingType,\n parseListingIdFromLogs,\n} from '../../utils/contract-helpers.js';\nimport { IndexerClient } from '../../utils/indexer-client.js';\nimport { mapListingRow } from '../../utils/indexer-mappers.js';\nimport type {\n RegisterListingOptions,\n Listing,\n SearchQuery,\n SearchResults,\n HireOptions,\n HireResult,\n CompletionResult,\n TxReceipt,\n UpdateListingOptions,\n FeaturedOptions,\n CompleteHireOptions,\n} from './types.js';\n\n/** Shape of the on-chain Listing struct returned by getListing */\ninterface OnChainListing {\n listingId: `0x${string}`;\n ownerIdentityId: `0x${string}`;\n owner: `0x${string}`;\n name: string;\n description: string;\n category: number;\n pricingType: number;\n price: bigint;\n metadataUri: string;\n active: boolean;\n createdAt: bigint;\n updatedAt: bigint;\n}\n\n/** Default reputation for on-chain fallback (indexer provides enriched data) */\nconst DEFAULT_REPUTATION: ReputationScore = {\n overall: 0,\n reliability: 0,\n speed: 0,\n volume: 0,\n consistency: 0,\n policyCompliance: 0,\n reviewAverage: 0,\n reviewCount: 0,\n tier: 'unrated',\n};\n\n/** Default review summary for on-chain fallback */\nconst DEFAULT_REVIEW_SUMMARY: ReviewSummary = {\n average: 0,\n count: 0,\n distribution: { '1': 0, '2': 0, '3': 0, '4': 0, '5': 0 },\n recentReviews: [],\n};\n\n/**\n * Pre-built primitives for building verified marketplaces.\n *\n * The Marketplace Kit provides everything needed to build a marketplace\n * where any identity type can list services, be discovered, hired, and\n * reviewed. V1 focuses on AI agent marketplaces.\n *\n * The full flow: Register -> Search -> Hire -> Complete\n * Hiring automatically creates an escrow + policy in one call.\n *\n * @example\n * ```typescript\n * const listing = await inv.marketplace.register({\n * identity: agent.identityId,\n * name: 'ContentGenius Pro',\n * description: 'AI content writer',\n * category: 'content',\n * pricing: { type: 'per-task', amount: '25.00', currency: 'USDC' },\n * capabilities: ['blog-posts', 'seo-optimization'],\n * });\n * ```\n */\nexport class MarketplaceKit {\n private readonly contracts: ContractFactory;\n private readonly events: InvarianceEventEmitter;\n private readonly telemetry: Telemetry;\n private indexer: IndexerClient | null = null;\n\n constructor(\n contracts: ContractFactory,\n events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ) {\n this.contracts = contracts;\n this.events = events;\n this.telemetry = telemetry;\n }\n\n /** Get the contract address for the registry module */\n getContractAddress(): string {\n return this.contracts.getAddress('registry');\n }\n\n /** Lazily initialize the indexer client */\n private getIndexer(): IndexerClient {\n if (!this.indexer) {\n this.indexer = new IndexerClient(this.contracts.getApiBaseUrl(), this.contracts.getApiKey());\n }\n return this.indexer;\n }\n\n /**\n * Map an on-chain listing tuple to the SDK Listing type.\n * Uses sensible defaults for reputation/reviews since the indexer provides enriched data.\n */\n private mapOnChainListing(raw: OnChainListing, txHash?: string): Listing {\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const listingIdStr = fromBytes32(raw.listingId);\n const pricingType = enumToPricingType(raw.pricingType);\n\n // Parse metadata URI for extra fields\n let capabilities: string[] = [];\n let metadata: Record<string, unknown> = {};\n if (raw.metadataUri) {\n try {\n metadata = JSON.parse(raw.metadataUri) as Record<string, unknown>;\n if (Array.isArray(metadata['capabilities'])) {\n capabilities = metadata['capabilities'] as string[];\n }\n } catch {\n // Not JSON — treat as opaque URI\n }\n }\n\n return {\n listingId: listingIdStr || raw.listingId,\n identity: {\n identityId: fromBytes32(raw.ownerIdentityId) || raw.ownerIdentityId,\n type: 'agent',\n address: raw.owner,\n owner: raw.owner,\n label: raw.name,\n capabilities,\n status: raw.active ? 'active' : 'deactivated',\n attestations: 0,\n createdAt: Number(raw.createdAt),\n txHash: txHash ?? '',\n explorerUrl: `${explorerBase}/identity/${raw.ownerIdentityId}`,\n },\n name: raw.name,\n description: raw.description,\n category: enumToListingCategory(raw.category),\n pricing: {\n type: pricingType,\n amount: raw.price.toString(),\n currency: 'USDC',\n },\n capabilities,\n reputation: { ...DEFAULT_REPUTATION },\n reviewSummary: { ...DEFAULT_REVIEW_SUMMARY, recentReviews: [] },\n active: raw.active,\n createdAt: Number(raw.createdAt),\n txHash: txHash ?? '',\n explorerUrl: `${explorerBase}/listing/${raw.listingId}`,\n };\n }\n\n /**\n * Build a metadata URI JSON string from registration/update options.\n */\n private buildMetadataUri(opts: {\n capabilities?: string[];\n tags?: string[];\n avatar?: string;\n apiEndpoint?: string;\n sla?: { maxResponseTime: string; uptime: number; refundPolicy: string };\n }): string {\n const metadata: Record<string, unknown> = {};\n if (opts.capabilities?.length) metadata['capabilities'] = opts.capabilities;\n if (opts.tags?.length) metadata['tags'] = opts.tags;\n if (opts.avatar) metadata['avatar'] = opts.avatar;\n if (opts.apiEndpoint) metadata['apiEndpoint'] = opts.apiEndpoint;\n if (opts.sla) metadata['sla'] = opts.sla;\n return JSON.stringify(metadata);\n }\n\n /**\n * Register an identity on the marketplace.\n *\n * Creates a public listing with pricing, capabilities, and SLA details.\n * The listing is linked to the identity's on-chain reputation.\n *\n * @param opts - Listing registration options\n * @returns The created listing\n */\n async register(opts: RegisterListingOptions): Promise<Listing> {\n this.telemetry.track('marketplace.register', { category: opts.category });\n\n // Input validation\n if (!opts.name || opts.name.trim().length === 0) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n 'Listing name cannot be empty',\n );\n }\n const priceNum = parseFloat(opts.pricing.amount);\n if (isNaN(priceNum) || priceNum <= 0) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Invalid price: ${opts.pricing.amount}. Must be a positive number.`,\n );\n }\n\n try {\n const contract = this.contracts.getContract('registry');\n const publicClient = this.contracts.getPublicClient();\n\n const identityId = toBytes32(opts.identity);\n const category = listingCategoryToEnum(opts.category);\n const pricingType = pricingTypeToEnum(opts.pricing.type);\n const price = BigInt(Math.round(priceNum * 1e6)); // USDC has 6 decimals\n const metadataUri = this.buildMetadataUri(opts);\n\n const registerFn = contract.write['register'];\n if (!registerFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'register function not found on contract');\n const txHash = await registerFn([identityId, opts.name, opts.description, category, pricingType, price, metadataUri]);\n\n const receipt = await waitForReceipt(publicClient, txHash);\n\n // Parse listing ID from event logs\n const listingId = parseListingIdFromLogs(receipt.logs);\n\n // Read back the full listing from chain\n const getListingFn = contract.read['getListing'];\n if (!getListingFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getListing function not found on contract');\n const raw = await getListingFn([listingId]) as OnChainListing;\n\n const listing = this.mapOnChainListing(raw, receipt.txHash);\n\n this.events.emit('marketplace.listed', {\n listingId: listing.listingId,\n });\n\n return listing;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Update listing details.\n *\n * @param listingId - The listing to update\n * @param opts - Fields to update\n * @returns The updated listing\n */\n async update(listingId: string, opts: UpdateListingOptions): Promise<Listing> {\n this.telemetry.track('marketplace.update');\n\n try {\n const contract = this.contracts.getContract('registry');\n const publicClient = this.contracts.getPublicClient();\n const listingIdBytes = toBytes32(listingId);\n\n // Fetch existing listing to merge unchanged fields\n const getListingFn = contract.read['getListing'];\n if (!getListingFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getListing function not found on contract');\n const existing = await getListingFn([listingIdBytes]) as OnChainListing;\n\n const name = opts.name ?? existing.name;\n const description = opts.description ?? existing.description;\n const pricingType = opts.pricing\n ? pricingTypeToEnum(opts.pricing.type)\n : existing.pricingType;\n const price = opts.pricing\n ? BigInt(Math.round(parseFloat(opts.pricing.amount) * 1e6))\n : existing.price;\n\n // Merge metadata\n let existingMeta: Record<string, unknown> = {};\n if (existing.metadataUri) {\n try { existingMeta = JSON.parse(existing.metadataUri) as Record<string, unknown>; } catch { /* ignore */ }\n }\n const mergedMeta: Record<string, unknown> = { ...existingMeta };\n if (opts.capabilities) mergedMeta['capabilities'] = opts.capabilities;\n if (opts.tags) mergedMeta['tags'] = opts.tags;\n if (opts.avatar !== undefined) mergedMeta['avatar'] = opts.avatar;\n if (opts.apiEndpoint !== undefined) mergedMeta['apiEndpoint'] = opts.apiEndpoint;\n if (opts.sla) mergedMeta['sla'] = opts.sla;\n const metadataUri = JSON.stringify(mergedMeta);\n\n const updateFn = contract.write['update'];\n if (!updateFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'update function not found on contract');\n const txHash = await updateFn([listingIdBytes, name, description, pricingType, price, metadataUri]);\n\n await waitForReceipt(publicClient, txHash);\n\n // Read back updated listing\n const raw = await getListingFn([listingIdBytes]) as OnChainListing;\n return this.mapOnChainListing(raw, txHash);\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Deactivate a listing.\n *\n * The listing will no longer appear in search results but\n * existing hires remain active until completed.\n *\n * @param listingId - The listing to deactivate\n * @returns Transaction receipt\n */\n async deactivate(listingId: string): Promise<TxReceipt> {\n this.telemetry.track('marketplace.deactivate');\n\n try {\n const contract = this.contracts.getContract('registry');\n const publicClient = this.contracts.getPublicClient();\n const listingIdBytes = toBytes32(listingId);\n\n const deactivateFn = contract.write['deactivate'];\n if (!deactivateFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'deactivate function not found on contract');\n const txHash = await deactivateFn([listingIdBytes]);\n\n const receipt = await waitForReceipt(publicClient, txHash);\n\n return {\n txHash: receipt.txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n status: receipt.status,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Search and filter marketplace listings.\n *\n * Supports text search, category filtering, rating thresholds,\n * price ranges, and capability matching.\n *\n * @param query - Search query with filters\n * @returns Paginated search results with facets\n */\n async search(query: SearchQuery): Promise<SearchResults> {\n this.telemetry.track('marketplace.search', { category: query.category });\n\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (available) {\n try {\n const pageSize = Math.max(1, query.pageSize ?? 20);\n const page = Math.max(1, query.page ?? 1);\n const params: Record<string, string | number | undefined> = {\n search: query.text,\n category: query.category,\n maxPrice: query.maxPrice,\n page,\n pageSize,\n };\n\n const rows = await indexer.get<Record<string, unknown>[]>('/marketplace', params);\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const listings = rows.map((row) => mapListingRow(row, explorerBase));\n\n const facets = listings.reduce((acc, listing) => {\n acc.categories[listing.category] = (acc.categories[listing.category] ?? 0) + 1;\n acc.actorTypes[listing.identity.type] = (acc.actorTypes[listing.identity.type] ?? 0) + 1;\n return acc;\n }, {\n categories: {} as Record<string, number>,\n actorTypes: {} as Record<string, number>,\n priceRange: { min: '0', max: '0' },\n avgRating: 0,\n });\n\n if (listings.length > 0) {\n const prices = listings.map((l) => Number(l.pricing.amount)).filter((n) => !Number.isNaN(n));\n const min = prices.length ? Math.min(...prices) : 0;\n const max = prices.length ? Math.max(...prices) : 0;\n facets.priceRange = { min: String(min), max: String(max) };\n const avg = listings.reduce((sum, l) => sum + (l.reputation.reviewAverage ?? 0), 0) / listings.length;\n facets.avgRating = Number.isNaN(avg) ? 0 : avg;\n }\n\n return {\n listings,\n total: listings.length,\n page,\n facets,\n };\n } catch {\n // Fall through to empty results\n }\n }\n\n return {\n listings: [],\n total: 0,\n page: query.page ?? 1,\n facets: {\n categories: {},\n actorTypes: {},\n priceRange: { min: '0', max: '0' },\n avgRating: 0,\n },\n };\n }\n\n /**\n * Get a single listing with full details.\n *\n * @param listingId - The listing ID\n * @returns The listing with reputation and reviews\n */\n async get(listingId: string): Promise<Listing> {\n this.telemetry.track('marketplace.get');\n\n // Try indexer first\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (available) {\n try {\n const row = await indexer.get<Record<string, unknown>>(`/marketplace/${listingId}`);\n return mapListingRow(row, this.contracts.getExplorerBaseUrl());\n } catch {\n // Fall through to on-chain\n }\n }\n\n // On-chain fallback\n try {\n const contract = this.contracts.getContract('registry');\n const listingIdBytes = toBytes32(listingId);\n\n const getListingFn = contract.read['getListing'];\n if (!getListingFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getListing function not found on contract');\n const raw = await getListingFn([listingIdBytes]) as OnChainListing;\n\n // Verify listing exists (zero address means not found)\n if (raw.owner === '0x0000000000000000000000000000000000000000') {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Listing not found: ${listingId}`,\n );\n }\n\n return this.mapOnChainListing(raw);\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Get top-rated listings by category.\n *\n * @param opts - Optional category and limit\n * @returns Array of featured listings\n */\n async featured(opts?: FeaturedOptions): Promise<Listing[]> {\n this.telemetry.track('marketplace.featured', { category: opts?.category });\n\n const indexer = this.getIndexer();\n const available = await indexer.isAvailable();\n\n if (available) {\n try {\n const params: Record<string, string | number | undefined> = {\n category: opts?.category,\n limit: opts?.limit,\n };\n const rows = await indexer.get<Record<string, unknown>[]>('/marketplace/featured', params);\n const explorerBase = this.contracts.getExplorerBaseUrl();\n return rows.map((row) => mapListingRow(row, explorerBase));\n } catch {\n // Fall through to empty\n }\n }\n\n return [];\n }\n\n /**\n * Hire from a listing.\n *\n * This is a compound operation that creates an escrow, policy, and\n * on-chain hire record in a single call. The escrow holds the payment,\n * the policy constrains what the hired identity can do, and the hire\n * contract records the agreement on-chain.\n *\n * @param opts - Hire options (listing, task, payment, policy)\n * @returns Hire result with escrow and policy IDs\n */\n async hire(opts: HireOptions): Promise<HireResult> {\n this.telemetry.track('marketplace.hire');\n\n try {\n // 1. Verify listing exists and is active\n const listing = await this.get(opts.listingId);\n if (!listing.active) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Listing is not active: ${opts.listingId}`,\n );\n }\n\n const publicClient = this.contracts.getPublicClient();\n const explorerBase = this.contracts.getExplorerBaseUrl();\n\n // 2. Create escrow\n const escrowContract = this.contracts.getContract('escrow');\n const identityId = toBytes32(listing.identity.identityId);\n const amount = BigInt(Math.round(parseFloat(opts.payment.amount) * 1e6));\n\n const createEscrowFn = escrowContract.write['create'];\n if (!createEscrowFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'create function not found on escrow contract');\n const escrowTxHash = await createEscrowFn([identityId, amount]);\n const escrowReceipt = await waitForReceipt(publicClient, escrowTxHash);\n const escrowId = fromBytes32(escrowReceipt.logs[0]?.topics[1] as `0x${string}` ?? '0x' + '00'.repeat(32) as `0x${string}`);\n\n // 3. Create policy if opts provided\n let policyId = '';\n if (opts.policy) {\n const policyContract = this.contracts.getContract('policy');\n const createPolicyFn = policyContract.write['create'];\n if (!createPolicyFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'create function not found on policy contract');\n const policyTxHash = await createPolicyFn([identityId]);\n const policyReceipt = await waitForReceipt(publicClient, policyTxHash);\n policyId = fromBytes32(policyReceipt.logs[0]?.topics[1] as `0x${string}` ?? '0x' + '00'.repeat(32) as `0x${string}`);\n }\n\n // 4. Record hire on-chain\n const hireContract = this.contracts.getContract('hire');\n const listingIdBytes = toBytes32(opts.listingId);\n const escrowIdBytes = toBytes32(escrowId);\n const policyIdBytes = toBytes32(policyId);\n\n const createHireFn = hireContract.write['create'];\n if (!createHireFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'create function not found on hire contract');\n const hireTxHash = await createHireFn([\n listingIdBytes,\n escrowIdBytes,\n policyIdBytes,\n listing.identity.address,\n opts.task.description,\n ]);\n const hireReceipt = await waitForReceipt(publicClient, hireTxHash);\n const hireId = fromBytes32(hireReceipt.logs[0]?.topics[1] as `0x${string}` ?? '0x' + '00'.repeat(32) as `0x${string}`);\n\n this.events.emit('marketplace.hired', {\n hireId,\n listingId: opts.listingId,\n hirer: this.contracts.getWalletAddress(),\n provider: listing.identity.address,\n escrowId,\n policyId,\n });\n\n return {\n hireId,\n escrowId,\n policyId,\n listing,\n status: 'active',\n explorerUrl: `${explorerBase}/hire/${hireId}`,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Complete a job and optionally leave a review.\n *\n * Marks the hire as completed on-chain, releases the escrow,\n * submits a review (if provided), and updates the identity's reputation.\n *\n * @param hireId - The hire to complete\n * @param opts - Completion options (optional review)\n * @returns Completion result with escrow and reputation updates\n */\n async complete(hireId: string, opts?: CompleteHireOptions): Promise<CompletionResult> {\n this.telemetry.track('marketplace.complete', { hasReview: opts?.review !== undefined });\n\n try {\n const publicClient = this.contracts.getPublicClient();\n const explorerBase = this.contracts.getExplorerBaseUrl();\n const hireIdBytes = toBytes32(hireId);\n\n // 1. Read hire from chain to get escrowId\n const hireContract = this.contracts.getContract('hire');\n const getHireFn = hireContract.read['getHire'];\n if (!getHireFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getHire function not found on hire contract');\n const hire = await getHireFn([hireIdBytes]) as {\n escrowId: `0x${string}`;\n listingId: `0x${string}`;\n hirer: `0x${string}`;\n provider: `0x${string}`;\n };\n\n // 2. Mark hire as completed on-chain\n const completeFn = hireContract.write['complete'];\n if (!completeFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'complete function not found on hire contract');\n const completeTxHash = await completeFn([hireIdBytes]);\n await waitForReceipt(publicClient, completeTxHash);\n\n // 3. Release escrow\n const escrowContract = this.contracts.getContract('escrow');\n const releaseFn = escrowContract.write['release'];\n if (!releaseFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'release function not found on escrow contract');\n const releaseTxHash = await releaseFn([hire.escrowId]);\n await waitForReceipt(publicClient, releaseTxHash);\n\n // 4. Submit review if provided\n let reviewId = '';\n if (opts?.review) {\n const reviewContract = this.contracts.getContract('review');\n const submitFn = reviewContract.write['submit'];\n if (!submitFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'submit function not found on review contract');\n\n const reviewTxHash = await submitFn([\n hire.escrowId,\n opts.review.rating,\n opts.review.comment ?? '',\n ]);\n const reviewReceipt = await waitForReceipt(publicClient, reviewTxHash);\n reviewId = reviewReceipt.txHash;\n }\n\n this.events.emit('marketplace.hire.completed', {\n hireId,\n hirer: hire.hirer,\n provider: hire.provider,\n listingId: fromBytes32(hire.listingId),\n escrowId: fromBytes32(hire.escrowId),\n completedAt: Date.now(),\n });\n\n return {\n hireId,\n escrowReleased: true,\n reviewId,\n updatedReputation: { ...DEFAULT_REPUTATION },\n explorerUrl: `${explorerBase}/hire/${hireId}`,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Get a hire agreement from the on-chain contract.\n *\n * @param hireId - The hire ID\n * @returns The on-chain hire data\n */\n async getHire(hireId: string): Promise<{\n hireId: string;\n listingId: string;\n escrowId: string;\n policyId: string;\n hirer: string;\n provider: string;\n taskDescription: string;\n status: number;\n createdAt: number;\n completedAt: number;\n }> {\n const hireContract = this.contracts.getContract('hire');\n const getHireFn = hireContract.read['getHire'];\n if (!getHireFn) throw new InvarianceError(ErrorCode.NETWORK_ERROR, 'getHire function not found on hire contract');\n\n const hireIdBytes = toBytes32(hireId);\n const raw = await getHireFn([hireIdBytes]) as {\n hireId: `0x${string}`;\n listingId: `0x${string}`;\n escrowId: `0x${string}`;\n policyId: `0x${string}`;\n hirer: `0x${string}`;\n provider: `0x${string}`;\n taskDescription: string;\n status: number;\n createdAt: bigint;\n completedAt: bigint;\n };\n\n return {\n hireId: fromBytes32(raw.hireId),\n listingId: fromBytes32(raw.listingId),\n escrowId: fromBytes32(raw.escrowId),\n policyId: fromBytes32(raw.policyId),\n hirer: raw.hirer,\n provider: raw.provider,\n taskDescription: raw.taskDescription,\n status: raw.status,\n createdAt: Number(raw.createdAt),\n completedAt: Number(raw.completedAt),\n };\n }\n}\n","import type { InvarianceConfig, AuditLogInput, AuditLogRecord, AuditQueryFilters } from '@invariance/common';\nimport type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../../errors/InvarianceError.js';\nimport { IndexerClient } from '../../utils/indexer-client.js';\nimport type { EventLedger } from '../ledger/EventLedger.js';\nimport type { GateActionOptions, GateActionResult, ResolvedAuditConfig } from './types.js';\n\n/** Default API route used for off-chain audit ingest/query. */\nconst DEFAULT_AUDIT_ROUTE = '/audit/logs';\n\nexport class AuditTrail {\n private readonly contracts: ContractFactory;\n private readonly events: InvarianceEventEmitter;\n private readonly telemetry: Telemetry;\n private readonly ledger: EventLedger;\n private readonly config: ResolvedAuditConfig;\n private indexer: IndexerClient | null = null;\n\n constructor(\n contracts: ContractFactory,\n events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ledger: EventLedger,\n config?: InvarianceConfig['audit'],\n ) {\n this.contracts = contracts;\n this.events = events;\n this.telemetry = telemetry;\n this.ledger = ledger;\n this.config = {\n enabled: config?.enabled ?? true,\n mode: config?.mode ?? 'offchain',\n visibility: config?.visibility ?? 'private',\n route: config?.route ?? DEFAULT_AUDIT_ROUTE,\n failOpen: config?.failOpen ?? true,\n };\n }\n\n /** Resolved audit configuration currently used by this module. */\n getSettings(): ResolvedAuditConfig {\n return { ...this.config };\n }\n\n /** Log a single off-chain audit record. */\n async log(input: AuditLogInput): Promise<AuditLogRecord> {\n this.telemetry.track('audit.log', {\n action: input.action,\n status: input.status,\n mode: 'offchain',\n });\n\n const record = await this.getIndexer().post<AuditLogRecord>(this.config.route, {\n ...input,\n visibility: input.visibility ?? this.config.visibility,\n timestamp: input.timestamp ?? Date.now(),\n });\n return record;\n }\n\n /** Query off-chain audit logs. */\n async query(filters: AuditQueryFilters): Promise<{ data: AuditLogRecord[]; total: number }> {\n this.telemetry.track('audit.query', { hasFilters: Object.keys(filters).length > 0 });\n return this.getIndexer().getPaginated<AuditLogRecord>(this.config.route, {\n actor: filters.actor,\n action: Array.isArray(filters.action) ? filters.action.join(',') : filters.action,\n status: filters.status,\n category: filters.category,\n visibility: filters.visibility,\n from: typeof filters.from === 'string' ? filters.from : filters.from?.toString(),\n to: typeof filters.to === 'string' ? filters.to : filters.to?.toString(),\n page: filters.page,\n pageSize: filters.pageSize,\n });\n }\n\n /**\n * Execute any action through a consistent SDK gate:\n * - emits action lifecycle events\n * - writes off-chain audit logs (default)\n * - optionally anchors to on-chain ledger\n */\n async gate<T>(opts: GateActionOptions, executor: () => Promise<T>): Promise<GateActionResult<T>> {\n const mode = opts.mode ?? this.config.mode;\n const startedAt = Date.now();\n const requestId = opts.requestId ?? `audit_${startedAt.toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n\n this.events.emit('action.before', {\n action: opts.action,\n actor: opts.actor,\n timestamp: startedAt,\n });\n\n let offchainAttemptId: string | undefined;\n if (this.config.enabled && (mode === 'offchain' || mode === 'dual')) {\n const attemptPayload: AuditLogInput = {\n action: opts.action,\n actor: opts.actor,\n status: 'attempt',\n visibility: opts.visibility ?? this.config.visibility,\n requestId,\n timestamp: startedAt,\n };\n if (opts.category !== undefined) attemptPayload.category = opts.category;\n if (opts.metadata !== undefined) attemptPayload.metadata = opts.metadata;\n offchainAttemptId = await this.tryOffchainLog(attemptPayload);\n }\n\n try {\n const result = await executor();\n const durationMs = Date.now() - startedAt;\n\n let onchainEntryId: string | undefined;\n if (this.config.enabled && (mode === 'onchain' || mode === 'dual')) {\n const entry = await this.ledger.log({\n action: opts.action,\n actor: opts.actor,\n category: (opts.category as 'execution' | 'payment' | 'policy' | 'attestation' | 'custom' | undefined) ?? 'execution',\n severity: 'info',\n metadata: {\n ...(opts.metadata ?? {}),\n requestId,\n status: 'success',\n durationMs,\n },\n });\n onchainEntryId = entry.entryId;\n }\n\n const offchainSuccessId = this.config.enabled && (mode === 'offchain' || mode === 'dual')\n ? await this.tryOffchainLog((() => {\n const successPayload: AuditLogInput = {\n action: opts.action,\n actor: opts.actor,\n status: 'success',\n visibility: opts.visibility ?? this.config.visibility,\n requestId,\n durationMs,\n timestamp: Date.now(),\n };\n if (opts.category !== undefined) successPayload.category = opts.category;\n if (opts.metadata !== undefined) successPayload.metadata = opts.metadata;\n return successPayload;\n })())\n : undefined;\n\n this.events.emit('action.after', {\n action: opts.action,\n actor: opts.actor,\n durationMs,\n success: true,\n timestamp: Date.now(),\n });\n\n const output: GateActionResult<T> = { result, mode };\n if (onchainEntryId !== undefined) output.onchainEntryId = onchainEntryId;\n if (offchainAttemptId !== undefined || offchainSuccessId !== undefined) {\n output.offchain = {};\n if (offchainAttemptId !== undefined) output.offchain.attemptId = offchainAttemptId;\n if (offchainSuccessId !== undefined) output.offchain.successId = offchainSuccessId;\n }\n return output;\n } catch (err) {\n const durationMs = Date.now() - startedAt;\n const message = err instanceof Error ? err.message : String(err);\n\n this.events.emit('action.error', {\n action: opts.action,\n message,\n timestamp: Date.now(),\n });\n this.events.emit('action.after', {\n action: opts.action,\n actor: opts.actor,\n durationMs,\n success: false,\n timestamp: Date.now(),\n });\n\n if (this.config.enabled && (mode === 'offchain' || mode === 'dual')) {\n const failurePayload: AuditLogInput = {\n action: opts.action,\n actor: opts.actor,\n status: 'failure',\n visibility: opts.visibility ?? this.config.visibility,\n requestId,\n durationMs,\n error: { message },\n timestamp: Date.now(),\n };\n if (opts.category !== undefined) failurePayload.category = opts.category;\n if (opts.metadata !== undefined) failurePayload.metadata = opts.metadata;\n await this.tryOffchainLog(failurePayload);\n }\n\n if (this.config.enabled && (mode === 'onchain' || mode === 'dual')) {\n try {\n await this.ledger.log({\n action: opts.action,\n actor: opts.actor,\n category: (opts.category as 'execution' | 'payment' | 'policy' | 'attestation' | 'custom' | undefined) ?? 'execution',\n severity: 'error',\n metadata: {\n ...(opts.metadata ?? {}),\n requestId,\n status: 'failure',\n durationMs,\n error: message,\n },\n });\n } catch (onchainErr) {\n if (!this.config.failOpen) {\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `On-chain audit logging failed: ${onchainErr instanceof Error ? onchainErr.message : String(onchainErr)}`,\n );\n }\n }\n }\n\n throw err;\n }\n }\n\n private getIndexer(): IndexerClient {\n if (!this.indexer) {\n this.indexer = new IndexerClient(this.contracts.getApiBaseUrl(), this.contracts.getApiKey());\n }\n return this.indexer;\n }\n\n private async tryOffchainLog(input: AuditLogInput): Promise<string | undefined> {\n try {\n const row = await this.log(input);\n return row.id;\n } catch (err) {\n if (!this.config.failOpen) {\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Off-chain audit logging failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n return undefined;\n }\n }\n}\n","import type { WalletClient } from 'viem';\nimport type { VoteInput } from '@invariance/common';\n\n/** EIP-712 domain for vote signing */\nexport interface VoteDomain {\n name: string;\n version: string;\n chainId: number;\n verifyingContract: `0x${string}`;\n}\n\n/** EIP-712 types for a Vote */\nconst VOTE_TYPES = {\n Vote: [\n { name: 'proposalId', type: 'bytes32' },\n { name: 'voter', type: 'address' },\n { name: 'support', type: 'bool' },\n { name: 'weight', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n ],\n} as const;\n\n/**\n * Sign a vote using EIP-712 typed data.\n *\n * @param walletClient - Viem wallet client for signing\n * @param domain - EIP-712 domain parameters\n * @param input - Vote input (proposalId, support, weight)\n * @param voter - Voter address\n * @param nonce - Replay protection nonce\n * @returns EIP-712 signature hex string\n */\nexport async function signVote(\n walletClient: WalletClient,\n domain: VoteDomain,\n input: VoteInput,\n voter: `0x${string}`,\n nonce: bigint,\n): Promise<string> {\n const signature = await walletClient.signTypedData({\n account: voter,\n domain,\n types: VOTE_TYPES,\n primaryType: 'Vote',\n message: {\n proposalId: input.proposalId as `0x${string}`,\n voter,\n support: input.support,\n weight: input.weight,\n nonce,\n },\n });\n\n return signature;\n}\n\n/**\n * Build the EIP-712 domain for the voting contract.\n *\n * @param chainId - Chain ID\n * @param contractAddress - Voting contract address\n * @returns VoteDomain\n */\nexport function buildVoteDomain(chainId: number, contractAddress: `0x${string}`): VoteDomain {\n return {\n name: 'InvarianceVoting',\n version: '1',\n chainId,\n verifyingContract: contractAddress,\n };\n}\n","import { StandardMerkleTree } from '@openzeppelin/merkle-tree';\nimport type { Vote, MerkleProofBundle } from '@invariance/common';\n\n/** Leaf encoding: [voter: address, support: bool, weight: uint256] */\nconst LEAF_ENCODING = ['address', 'bool', 'uint256'] as const;\n\n/**\n * Build a merkle tree from an array of votes.\n *\n * Uses OpenZeppelin's StandardMerkleTree which double-hashes leaves\n * (keccak256(bytes.concat(keccak256(abi.encode(...))))), matching the\n * on-chain MerkleProof.verify behavior.\n *\n * @param votes - Array of signed votes\n * @returns StandardMerkleTree instance\n */\nexport function buildMerkleTree(\n votes: Vote[],\n): StandardMerkleTree<[string, boolean, bigint]> {\n const values: [string, boolean, bigint][] = votes.map((v) => [\n v.voter,\n v.support,\n v.weight,\n ]);\n\n return StandardMerkleTree.of(values, [...LEAF_ENCODING]);\n}\n\n/**\n * Generate a merkle proof for a specific vote.\n *\n * @param tree - The merkle tree\n * @param vote - The vote to generate a proof for\n * @returns MerkleProofBundle with proof, leaf, and root\n */\nexport function generateProof(\n tree: StandardMerkleTree<[string, boolean, bigint]>,\n vote: Vote,\n): MerkleProofBundle {\n const value: [string, boolean, bigint] = [vote.voter, vote.support, vote.weight];\n\n // Find the leaf index\n let leafIndex = -1;\n for (const [i, v] of tree.entries()) {\n if (v[0].toLowerCase() === value[0].toLowerCase() && v[1] === value[1] && v[2] === value[2]) {\n leafIndex = i;\n break;\n }\n }\n\n if (leafIndex === -1) {\n throw new Error(`Vote not found in tree for voter ${vote.voter}`);\n }\n\n const proof = tree.getProof(leafIndex);\n\n return {\n vote,\n proof,\n leaf: StandardMerkleTree.of([value], [...LEAF_ENCODING]).root, // single-leaf root = leaf hash\n root: tree.root,\n };\n}\n\n/**\n * Verify a merkle proof off-chain.\n *\n * @param root - Expected merkle root\n * @param vote - The vote to verify\n * @param proof - Merkle proof\n * @returns Whether the proof is valid\n */\nexport function verifyProofOffChain(\n root: string,\n vote: Vote,\n proof: string[],\n): boolean {\n const value: [string, boolean, bigint] = [vote.voter, vote.support, vote.weight];\n return StandardMerkleTree.verify(root, [...LEAF_ENCODING], value, proof);\n}\n","import type { ContractFactory } from '../../core/ContractFactory.js';\nimport type { InvarianceEventEmitter } from '../../core/EventEmitter.js';\nimport type { Telemetry } from '../../core/Telemetry.js';\nimport type {\n Vote,\n Proposal,\n VoteInput,\n CreateProposalOptions,\n MerkleProofBundle,\n SettlementData,\n} from '@invariance/common';\nimport { toBytes32, fromBytes32, mapContractError } from '../../utils/contract-helpers.js';\nimport { signVote, buildVoteDomain } from './vote-signing.js';\nimport { buildMerkleTree, generateProof, verifyProofOffChain } from './merkle-builder.js';\nimport type { StandardMerkleTree } from '@openzeppelin/merkle-tree';\n\n/**\n * Off-chain batch voting with merkle root settlement.\n *\n * Proposals are created on-chain for immutability. Votes are collected\n * off-chain as EIP-712 signed messages. A single merkle root posted\n * on-chain proves all votes (95%+ gas savings vs individual storage).\n *\n * @example\n * ```typescript\n * // Create a proposal\n * await inv.voting.createProposal({\n * proposalId: 'prop-1',\n * identityId: 'id-1',\n * title: 'Upgrade to v2',\n * descriptionHash: '0x...',\n * votingPeriod: 7 * 24 * 3600,\n * quorum: 100n,\n * threshold: 5000,\n * });\n *\n * // Cast votes off-chain\n * const vote = await inv.voting.castVote({ proposalId: 'prop-1', support: true, weight: 50n });\n *\n * // Settle with merkle root\n * await inv.voting.settleVotes('prop-1');\n *\n * // Verify any vote\n * const proof = inv.voting.generateProof('prop-1', vote.voter);\n * const valid = await inv.voting.verifyVote('prop-1', proof);\n * ```\n */\nexport class VotingManager {\n private readonly contracts: ContractFactory;\n private readonly telemetry: Telemetry;\n\n /** In-memory vote storage per proposal */\n private readonly voteStore: Map<string, Vote[]> = new Map();\n\n /** Cached merkle trees per proposal */\n private readonly treeCache: Map<string, StandardMerkleTree<[string, boolean, bigint]>> = new Map();\n\n constructor(\n contracts: ContractFactory,\n _events: InvarianceEventEmitter,\n telemetry: Telemetry,\n ) {\n this.contracts = contracts;\n this.telemetry = telemetry;\n }\n\n /**\n * Create a proposal on-chain.\n *\n * @param opts - Proposal creation options\n * @returns Transaction hash\n */\n async createProposal(opts: CreateProposalOptions): Promise<string> {\n this.telemetry.track('voting.createProposal');\n\n try {\n const votingContract = this.contracts.getContract('voting');\n const writeFn = votingContract.write['createProposal'];\n if (!writeFn) {\n throw new Error('createProposal function not found on voting contract');\n }\n\n const txHash = await writeFn([\n toBytes32(opts.proposalId),\n toBytes32(opts.identityId),\n opts.title,\n opts.descriptionHash as `0x${string}`,\n BigInt(opts.votingPeriod),\n opts.quorum,\n BigInt(opts.threshold),\n ]);\n\n // Initialize vote storage\n this.voteStore.set(opts.proposalId, []);\n\n return txHash as string;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Cast a vote off-chain with EIP-712 signature.\n *\n * The vote is signed and stored in memory. No on-chain transaction\n * occurs until settleVotes() is called.\n *\n * @param input - Vote input (proposalId, support, weight)\n * @returns The signed vote\n */\n async castVote(input: VoteInput): Promise<Vote> {\n this.telemetry.track('voting.castVote');\n\n const walletClient = this.contracts.getWalletClient();\n const voter = walletClient.account?.address;\n if (!voter) {\n throw new Error('No wallet connected — cannot sign vote');\n }\n\n const chainId = this.contracts.getChainId();\n const votingAddress = this.contracts.getAddress('voting') as `0x${string}`;\n const domain = buildVoteDomain(chainId, votingAddress);\n\n // Get nonce (number of existing votes by this voter for this proposal)\n const existing = this.voteStore.get(input.proposalId) ?? [];\n const nonce = BigInt(existing.filter((v) => v.voter.toLowerCase() === voter.toLowerCase()).length);\n\n const signature = await signVote(walletClient, domain, input, voter, nonce);\n\n const vote: Vote = {\n proposalId: input.proposalId,\n voter,\n support: input.support,\n weight: input.weight,\n nonce,\n signature,\n };\n\n // Store vote\n if (!this.voteStore.has(input.proposalId)) {\n this.voteStore.set(input.proposalId, []);\n }\n this.voteStore.get(input.proposalId)!.push(vote);\n\n // Invalidate tree cache\n this.treeCache.delete(input.proposalId);\n\n return vote;\n }\n\n /**\n * Build the merkle tree for a proposal's votes.\n *\n * @param proposalId - The proposal ID\n * @returns The merkle root\n */\n buildMerkleTree(proposalId: string): string {\n const votes = this.voteStore.get(proposalId);\n if (!votes || votes.length === 0) {\n throw new Error(`No votes found for proposal: ${proposalId}`);\n }\n\n const tree = buildMerkleTree(votes);\n this.treeCache.set(proposalId, tree);\n return tree.root;\n }\n\n /**\n * Settle votes on-chain by posting the merkle root.\n *\n * Builds the merkle tree, computes totals, and submits a single\n * transaction to the contract.\n *\n * @param proposalId - The proposal to settle\n * @returns Settlement data including tx hash\n */\n async settleVotes(proposalId: string): Promise<SettlementData & { txHash: string }> {\n this.telemetry.track('voting.settleVotes');\n\n const votes = this.voteStore.get(proposalId);\n if (!votes || votes.length === 0) {\n throw new Error(`No votes found for proposal: ${proposalId}`);\n }\n\n // Build tree\n const merkleRoot = this.buildMerkleTree(proposalId);\n\n // Compute totals\n let totalFor = 0n;\n let totalAgainst = 0n;\n for (const vote of votes) {\n if (vote.support) {\n totalFor += vote.weight;\n } else {\n totalAgainst += vote.weight;\n }\n }\n\n try {\n const votingContract = this.contracts.getContract('voting');\n const writeFn = votingContract.write['settleVotes'];\n if (!writeFn) {\n throw new Error('settleVotes function not found on voting contract');\n }\n\n const txHash = await writeFn([\n toBytes32(proposalId),\n merkleRoot as `0x${string}`,\n totalFor,\n totalAgainst,\n ]);\n\n return {\n proposalId,\n merkleRoot,\n totalFor,\n totalAgainst,\n txHash: txHash as string,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Generate a merkle proof for a specific voter.\n *\n * @param proposalId - The proposal ID\n * @param voter - Voter address\n * @returns Merkle proof bundle\n */\n generateProof(proposalId: string, voter: string): MerkleProofBundle {\n this.telemetry.track('voting.generateProof');\n\n let tree = this.treeCache.get(proposalId);\n if (!tree) {\n this.buildMerkleTree(proposalId);\n tree = this.treeCache.get(proposalId)!;\n }\n\n const votes = this.voteStore.get(proposalId)!;\n const vote = votes.find((v) => v.voter.toLowerCase() === voter.toLowerCase());\n if (!vote) {\n throw new Error(`No vote found for voter ${voter} in proposal ${proposalId}`);\n }\n\n return generateProof(tree, vote);\n }\n\n /**\n * Verify a vote on-chain using a merkle proof.\n *\n * @param proposalId - The proposal ID\n * @param bundle - Merkle proof bundle\n * @returns Whether the vote is valid\n */\n async verifyVote(proposalId: string, bundle: MerkleProofBundle): Promise<boolean> {\n this.telemetry.track('voting.verifyVote');\n\n try {\n const votingContract = this.contracts.getContract('voting');\n const readFn = votingContract.read['verifyVote'];\n if (!readFn) {\n throw new Error('verifyVote function not found on voting contract');\n }\n\n const result = await readFn([\n toBytes32(proposalId),\n bundle.vote.voter as `0x${string}`,\n bundle.vote.support,\n bundle.vote.weight,\n bundle.proof as `0x${string}`[],\n ]);\n\n return result as boolean;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Verify a vote off-chain using the merkle proof.\n *\n * @param root - Expected merkle root\n * @param vote - The vote to verify\n * @param proof - Merkle proof\n * @returns Whether the proof is valid\n */\n verifyVoteOffChain(root: string, vote: Vote, proof: string[]): boolean {\n this.telemetry.track('voting.verifyVoteOffChain');\n return verifyProofOffChain(root, vote, proof);\n }\n\n /**\n * Get a proposal from the contract.\n *\n * @param proposalId - The proposal ID\n * @returns Proposal data\n */\n async getProposal(proposalId: string): Promise<Proposal> {\n this.telemetry.track('voting.getProposal');\n\n try {\n const votingContract = this.contracts.getContract('voting');\n const readFn = votingContract.read['getProposal'];\n if (!readFn) {\n throw new Error('getProposal function not found on voting contract');\n }\n\n const raw = await readFn([toBytes32(proposalId)]) as {\n identityId: `0x${string}`;\n title: string;\n descriptionHash: `0x${string}`;\n votingPeriod: bigint;\n quorum: bigint;\n threshold: bigint;\n createdAt: bigint;\n merkleRoot: `0x${string}`;\n totalFor: bigint;\n totalAgainst: bigint;\n settled: boolean;\n };\n\n return {\n proposalId,\n identityId: fromBytes32(raw.identityId),\n title: raw.title,\n descriptionHash: raw.descriptionHash,\n votingPeriod: Number(raw.votingPeriod),\n quorum: raw.quorum,\n threshold: Number(raw.threshold),\n createdAt: Number(raw.createdAt),\n merkleRoot: raw.merkleRoot,\n totalFor: raw.totalFor,\n totalAgainst: raw.totalAgainst,\n settled: raw.settled,\n };\n } catch (err) {\n throw mapContractError(err);\n }\n }\n\n /**\n * Get all in-memory votes for a proposal.\n *\n * @param proposalId - The proposal ID\n * @returns Array of votes\n */\n getVotes(proposalId: string): Vote[] {\n return this.voteStore.get(proposalId) ?? [];\n }\n\n /**\n * Check if a settled proposal passed (on-chain).\n *\n * @param proposalId - The proposal ID\n * @returns Whether the proposal passed\n */\n async didPass(proposalId: string): Promise<boolean> {\n this.telemetry.track('voting.didPass');\n\n try {\n const votingContract = this.contracts.getContract('voting');\n const readFn = votingContract.read['didPass'];\n if (!readFn) {\n throw new Error('didPass function not found on voting contract');\n }\n\n return await readFn([toBytes32(proposalId)]) as boolean;\n } catch (err) {\n throw mapContractError(err);\n }\n }\n}\n","import { createHmac, timingSafeEqual } from 'crypto';\n\n/**\n * Verify an Invariance webhook HMAC-SHA256 signature.\n *\n * Use this in your webhook endpoint to verify that incoming\n * payloads are genuinely from Invariance and have not been tampered with.\n *\n * @param body - The raw request body (string or object)\n * @param signature - The signature from the `X-Invariance-Signature` header\n * @param secret - Your webhook secret (from webhook registration)\n * @returns True if the signature is valid\n *\n * @example\n * ```typescript\n * import { verifyWebhookSignature } from '@invariance/sdk';\n *\n * app.post('/webhooks/invariance', (req, res) => {\n * const sig = req.headers['x-invariance-signature'];\n * if (!verifyWebhookSignature(req.body, sig, WEBHOOK_SECRET)) {\n * return res.status(401).send('Invalid signature');\n * }\n * // Process webhook...\n * });\n * ```\n */\nexport function verifyWebhookSignature(\n body: unknown,\n signature: string,\n secret: string,\n): boolean {\n const payload = typeof body === 'string' ? body : JSON.stringify(body);\n const expected = createHmac('sha256', secret).update(payload).digest();\n const signatureBuffer = Buffer.from(signature, 'hex');\n\n // Use timing-safe comparison on fixed-length buffers\n if (expected.length !== signatureBuffer.length) {\n return false;\n }\n\n return timingSafeEqual(expected, signatureBuffer);\n}\n","/**\n * Generic pre/post action hooks for ANY agent runtime.\n * 3-line integration for any framework.\n *\n * @example\n * ```typescript\n * const hooks = new RuntimeHookAdapter(inv);\n * const { allowed } = await hooks.beforeAction({ action: 'swap', actor, params: {} });\n * await hooks.afterAction(ctx, { success: true, txHash: '0x...' });\n * ```\n */\nimport type { Invariance } from '../core/InvarianceClient.js';\nimport type { ActorReference } from '@invariance/common';\n\n/** Action context passed through hooks */\nexport interface ActionContext {\n /** Action identifier (e.g., 'swap', 'transfer') */\n action: string;\n /** Actor performing the action */\n actor: ActorReference;\n /** Action parameters */\n params: Record<string, unknown>;\n /** Optional policy to evaluate against */\n policyId?: string;\n /** Timestamp of action initiation */\n timestamp: number;\n}\n\n/** Result from beforeAction hook */\nexport interface BeforeActionResult {\n /** Whether the action is permitted */\n allowed: boolean;\n /** Reason if denied */\n reason?: string;\n /** Policy evaluation details */\n policyId?: string;\n}\n\n/** Result from afterAction hook */\nexport interface AfterActionResult {\n /** Ledger entry ID */\n entryId: string;\n /** Transaction hash */\n txHash: string;\n /** Duration in milliseconds */\n durationMs: number;\n}\n\n/** Hook callbacks for custom logic */\nexport interface RuntimeHooks {\n /** Called before policy evaluation */\n onBeforeEvaluate?: (ctx: ActionContext) => Promise<void> | void;\n /** Called after policy evaluation, before execution */\n onAfterEvaluate?: (ctx: ActionContext, result: BeforeActionResult) => Promise<void> | void;\n /** Called after logging */\n onAfterLog?: (ctx: ActionContext, result: AfterActionResult) => Promise<void> | void;\n /** Called on any error */\n onError?: (ctx: ActionContext, error: Error) => Promise<void> | void;\n}\n\n/**\n * RuntimeHookAdapter — drop-in verification for any agent runtime.\n *\n * @example\n * ```typescript\n * const hooks = new RuntimeHookAdapter(inv);\n * // Wrap any agent action:\n * const { result, log } = await hooks.wrap(\n * { action: 'swap', actor: { type: 'agent', address: '0x...' }, params: {} },\n * () => executeSwap(),\n * );\n * ```\n */\nexport class RuntimeHookAdapter {\n private readonly client: Invariance;\n private readonly hooks: RuntimeHooks;\n\n constructor(client: Invariance, hooks?: RuntimeHooks) {\n this.client = client;\n this.hooks = hooks ?? {};\n }\n\n /**\n * Evaluate policy and request intent before action execution.\n */\n async beforeAction(ctx: Omit<ActionContext, 'timestamp'>): Promise<BeforeActionResult> {\n const fullCtx: ActionContext = { ...ctx, timestamp: Date.now() };\n\n try {\n await this.hooks.onBeforeEvaluate?.(fullCtx);\n\n if (fullCtx.policyId) {\n const evaluation = await this.client.policy.evaluate({\n policyId: fullCtx.policyId,\n actor: fullCtx.actor,\n action: fullCtx.action,\n params: fullCtx.params,\n });\n\n const result: BeforeActionResult = { allowed: evaluation.allowed, policyId: fullCtx.policyId };\n if (!evaluation.allowed) {\n const evaluationWithReason = evaluation as unknown as { reason?: unknown };\n const fallbackReason = evaluationWithReason.reason;\n const reason = evaluation.ruleResults?.find((r) => !r.passed)?.detail\n ?? (typeof fallbackReason === 'string' ? fallbackReason : undefined);\n if (reason) result.reason = reason;\n }\n\n await this.hooks.onAfterEvaluate?.(fullCtx, result);\n return result;\n }\n\n const result: BeforeActionResult = { allowed: true };\n await this.hooks.onAfterEvaluate?.(fullCtx, result);\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n await this.hooks.onError?.(fullCtx, err);\n throw err;\n }\n }\n\n /**\n * Log action result to immutable ledger after execution.\n */\n async afterAction(\n ctx: Omit<ActionContext, 'timestamp'>,\n outcome: { success: boolean; txHash?: string; error?: string; metadata?: Record<string, unknown> },\n ): Promise<AfterActionResult> {\n const fullCtx: ActionContext = { ...ctx, timestamp: Date.now() };\n const startTime = Date.now();\n\n try {\n const entry = await this.client.ledger.log({\n action: fullCtx.action,\n actor: fullCtx.actor,\n category: 'custom',\n metadata: {\n params: fullCtx.params,\n success: outcome.success,\n txHash: outcome.txHash,\n error: outcome.error,\n ...outcome.metadata,\n },\n });\n\n const result: AfterActionResult = {\n entryId: entry.entryId,\n txHash: entry.txHash,\n durationMs: Date.now() - startTime,\n };\n\n await this.hooks.onAfterLog?.(fullCtx, result);\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n await this.hooks.onError?.(fullCtx, err);\n throw err;\n }\n }\n\n /**\n * Wrap an async function with before/after hooks.\n */\n async wrap<T>(\n ctx: Omit<ActionContext, 'timestamp'>,\n fn: () => Promise<T>,\n ): Promise<{ result: T; log: AfterActionResult }> {\n const before = await this.beforeAction(ctx);\n if (!before.allowed) {\n throw new Error(`Action '${ctx.action}' denied: ${before.reason ?? 'policy violation'}`);\n }\n\n let result: T;\n let txHash: string | undefined;\n try {\n result = await fn();\n if (result && typeof result === 'object' && 'txHash' in result) {\n txHash = (result as Record<string, unknown>)['txHash'] as string | undefined;\n }\n } catch (error) {\n await this.afterAction(ctx, { success: false, error: String(error) });\n throw error;\n }\n\n const afterOpts: { success: boolean; txHash?: string } = { success: true };\n if (txHash) afterOpts.txHash = txHash;\n const log = await this.afterAction(ctx, afterOpts);\n return { result, log };\n }\n}\n","/**\n * Setup crews with shared budgets and per-role policies.\n *\n * @example\n * ```typescript\n * const composer = new MultiAgentComposer(inv);\n * const crew = await composer.setupCrew({\n * name: 'research-crew',\n * budget: '5000',\n * roles: [\n * { name: 'researcher', rules: [], allowedActions: ['query', 'analyze'] },\n * { name: 'executor', rules: [], allowedActions: ['swap', 'transfer'], maxSpend: '1000' },\n * ],\n * members: [\n * { identity: { type: 'agent', owner: '0xDev', label: 'R-1' }, role: 'researcher' },\n * ],\n * signers: ['0xSigner1', '0xSigner2'],\n * threshold: 2,\n * });\n * ```\n */\nimport type { Invariance } from '../core/InvarianceClient.js';\nimport type { Identity } from '../modules/identity/types.js';\nimport type { SpecPolicy, PolicyRule } from '@invariance/common';\nimport type { EscrowContract } from '../modules/escrow/types.js';\n\n/** Role definition for a crew member */\nexport interface CrewRole {\n /** Role identifier (e.g., 'researcher', 'executor', 'reviewer') */\n name: string;\n /** Policy rules specific to this role */\n rules: PolicyRule[];\n /** Optional spending limit override for this role */\n maxSpend?: string;\n /** Allowed actions for this role */\n allowedActions?: string[];\n}\n\n/** Agent to register as part of a crew */\nexport interface CrewMember {\n /** Identity registration options */\n identity: {\n type: 'agent' | 'human' | 'device' | 'service';\n owner: string;\n label: string;\n metadata?: Record<string, unknown>;\n };\n /** Role name from the crew's role definitions */\n role: string;\n}\n\n/** Options for setting up a crew */\nexport interface SetupCrewOptions {\n /** Crew name */\n name: string;\n /** Shared budget amount in USDC */\n budget: string;\n /** Role definitions */\n roles: CrewRole[];\n /** Members to register */\n members: CrewMember[];\n /** Multi-sig signers for budget release */\n signers: string[];\n /** Required signatures for budget release */\n threshold: number;\n /** Budget escrow timeout (ISO 8601 duration, default: P30D) */\n timeout?: string;\n /** Shared policy rules that apply to ALL members */\n sharedRules?: PolicyRule[];\n}\n\n/** Result of crew setup */\nexport interface CrewSetupResult {\n /** Crew identifier */\n crewId: string;\n /** Registered member identities */\n members: Array<{\n identity: Identity;\n role: string;\n policy: SpecPolicy;\n }>;\n /** Shared budget escrow */\n escrow: EscrowContract;\n /** Shared policy (applied to all members) */\n sharedPolicy: SpecPolicy;\n}\n\n/**\n * MultiAgentComposer — orchestrate agent crews with shared budgets and role-based policies.\n */\nexport class MultiAgentComposer {\n private readonly client: Invariance;\n\n constructor(client: Invariance) {\n this.client = client;\n }\n\n /**\n * Register a crew of agents with shared budget and role-based policies.\n */\n async setupCrew(opts: SetupCrewOptions): Promise<CrewSetupResult> {\n const roleMap = new Map(opts.roles.map((r) => [r.name, r]));\n for (const member of opts.members) {\n if (!roleMap.has(member.role)) {\n throw new Error(\n `Unknown role '${member.role}' for member '${member.identity.label}'. Available: ${opts.roles.map((r) => r.name).join(', ')}`,\n );\n }\n }\n\n // Create shared policy\n const sharedRules: PolicyRule[] = [\n { type: 'max-spend', config: { amount: opts.budget, period: '24h' } },\n ...(opts.sharedRules ?? []),\n ];\n const sharedPolicy = await this.client.policy.create({\n name: `${opts.name}-shared`,\n rules: sharedRules,\n });\n\n // Create multi-sig escrow for shared budget\n const escrow = await this.client.createMultiSig({\n amount: opts.budget,\n recipient: { type: 'agent', address: opts.signers[0] ?? '' },\n signers: opts.signers,\n threshold: opts.threshold,\n timeout: opts.timeout ?? 'P30D',\n });\n\n // Register each member with role-specific policy\n const members: CrewSetupResult['members'] = [];\n for (const member of opts.members) {\n const role = roleMap.get(member.role)!;\n const roleRules: PolicyRule[] = [...role.rules];\n if (role.maxSpend) {\n roleRules.push({ type: 'max-spend', config: { amount: role.maxSpend, period: '24h' } });\n }\n if (role.allowedActions) {\n roleRules.push({ type: 'action-whitelist', config: { actions: role.allowedActions } });\n }\n\n const { metadata: rawMeta, ...identityBase } = member.identity;\n const identityMetadata = rawMeta\n ? Object.fromEntries(Object.entries(rawMeta).map(([k, v]) => [k, String(v)]))\n : undefined;\n const identity = await this.client.identity.register(\n identityMetadata ? { ...identityBase, metadata: identityMetadata } : identityBase,\n );\n const rolePolicy = await this.client.policy.create({\n name: `${opts.name}-${member.role}-${member.identity.label}`,\n rules: roleRules,\n });\n\n await this.client.policy.attach(sharedPolicy.policyId, identity.identityId);\n await this.client.policy.attach(rolePolicy.policyId, identity.identityId);\n members.push({ identity, role: member.role, policy: rolePolicy });\n }\n\n return {\n crewId: `crew-${opts.name}-${Date.now()}`,\n members,\n escrow,\n sharedPolicy,\n };\n }\n\n /**\n * Add a new member to an existing crew.\n */\n async addMember(\n crewSharedPolicyId: string,\n member: CrewMember,\n role: CrewRole,\n crewName: string,\n ): Promise<{ identity: Identity; policy: SpecPolicy }> {\n const { metadata: rawMeta2, ...identityBase2 } = member.identity;\n const identityMetadata = rawMeta2\n ? Object.fromEntries(Object.entries(rawMeta2).map(([k, v]) => [k, String(v)]))\n : undefined;\n const identity = await this.client.identity.register(\n identityMetadata ? { ...identityBase2, metadata: identityMetadata } : identityBase2,\n );\n const roleRules: PolicyRule[] = [...role.rules];\n if (role.maxSpend) {\n roleRules.push({ type: 'max-spend', config: { amount: role.maxSpend, period: '24h' } });\n }\n if (role.allowedActions) {\n roleRules.push({ type: 'action-whitelist', config: { actions: role.allowedActions } });\n }\n\n const policy = await this.client.policy.create({\n name: `${crewName}-${member.role}-${member.identity.label}`,\n rules: roleRules,\n });\n\n await this.client.policy.attach(crewSharedPolicyId, identity.identityId);\n await this.client.policy.attach(policy.policyId, identity.identityId);\n return { identity, policy };\n }\n}\n","/**\n * Publish agents to external stores with verified badges.\n *\n * @example\n * ```typescript\n * const plugin = new MarketplacePlugin(inv);\n * const { listing, badge } = await plugin.publishAgent({\n * identity: 'identity-123',\n * name: 'DataAnalyzer',\n * description: 'Analyzes datasets with ML',\n * category: 'analytics',\n * pricing: { model: 'per-task', amount: '50' },\n * generateBadge: true,\n * });\n * ```\n */\nimport type { Invariance } from '../core/InvarianceClient.js';\nimport type { Listing, RegisterListingOptions, HireResult } from '../modules/marketplace/types.js';\nimport type { Badge } from '../modules/reputation/types.js';\n\n/** Options for publishing an agent */\nexport interface PublishAgentOptions extends RegisterListingOptions {\n /** Auto-generate a reputation badge on publish */\n generateBadge?: boolean;\n /** Minimum reputation score required for badge */\n badgeThreshold?: number;\n}\n\n/** Result of publishing an agent */\nexport interface PublishResult {\n /** Created marketplace listing */\n listing: Listing;\n /** Generated badge (if requested) */\n badge?: Badge;\n}\n\n/** Options for hiring with escrow */\nexport interface HireWithEscrowOptions {\n /** Listing ID to hire from */\n listingId: string;\n /** Task description */\n task: { description: string; deadline?: string };\n /** Payment configuration */\n payment: { amount: string; type: 'escrow' };\n /** Optional fund amount override */\n fundAmount?: string;\n}\n\n/**\n * MarketplacePlugin — simplified publish + hire flows with verified badges.\n */\nexport class MarketplacePlugin {\n private readonly client: Invariance;\n\n constructor(client: Invariance) {\n this.client = client;\n }\n\n /**\n * Publish an agent listing with optional reputation badge.\n */\n async publishAgent(opts: PublishAgentOptions): Promise<PublishResult> {\n const { generateBadge, ...listingOpts } = opts;\n const listing = await this.client.marketplace.register(listingOpts);\n\n let badge: Badge | undefined;\n if (generateBadge && listing.identity) {\n const identityId = typeof listing.identity === 'string'\n ? listing.identity\n : listing.identity.identityId;\n const maybeBadge = await this.client.reputation.badge(identityId);\n badge = maybeBadge ?? undefined;\n }\n\n const result: PublishResult = { listing };\n if (badge) result.badge = badge;\n return result;\n }\n\n /**\n * Hire an agent with automatic escrow funding.\n */\n async hireWithEscrow(opts: HireWithEscrowOptions): Promise<HireResult> {\n const deadline = opts.task.deadline ?? new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString();\n\n const hireOpts: Parameters<Invariance['hireAndFund']>[0] = {\n listingId: opts.listingId,\n task: { ...opts.task, deadline },\n payment: opts.payment,\n };\n if (opts.fundAmount) hireOpts.fundAmount = opts.fundAmount;\n\n return this.client.hireAndFund(hireOpts);\n }\n\n /**\n * Get verified listing with reputation data.\n */\n async getVerifiedListing(listingId: string): Promise<{ listing: Listing; badge?: Badge }> {\n const listing = await this.client.marketplace.get(listingId);\n let badge: Badge | undefined;\n\n if (listing.identity) {\n const identityId = typeof listing.identity === 'string'\n ? listing.identity\n : listing.identity.identityId;\n try {\n const maybeBadge = await this.client.reputation.badge(identityId);\n badge = maybeBadge ?? undefined;\n } catch {\n // No badge available\n }\n }\n\n const result: { listing: Listing; badge?: Badge } = { listing };\n if (badge) result.badge = badge;\n return result;\n }\n}\n","/**\n * Import/aggregate scores from external platforms.\n *\n * @example\n * ```typescript\n * const bridge = new ReputationBridge(inv);\n * bridge.importExternalScore('identity-123', {\n * platform: 'gitcoin',\n * score: 85,\n * proofUrl: 'https://passport.gitcoin.co/...',\n * fetchedAt: Date.now(),\n * });\n * const agg = await bridge.getAggregatedScore('identity-123');\n * ```\n */\nimport type { Invariance } from '../core/InvarianceClient.js';\n\n/** External score source */\nexport interface ExternalScore {\n /** Platform name (e.g., 'gitcoin', 'lens', 'olas') */\n platform: string;\n /** Score value (0-100 normalized) */\n score: number;\n /** Source URL or proof */\n proofUrl?: string;\n /** When the score was fetched */\n fetchedAt: number;\n /** Raw score data from the platform */\n rawData?: Record<string, unknown>;\n}\n\n/** Aggregation weights configuration */\nexport interface AggregationWeights {\n /** Weight for Invariance on-chain score (default: 0.7) */\n invariance: number;\n /** Weight for external scores (default: 0.3) */\n external: number;\n}\n\n/** Aggregated reputation result */\nexport interface AggregatedReputation {\n /** Final weighted score (0-100) */\n score: number;\n /** Invariance on-chain score component */\n invarianceScore: number;\n /** Average external score component */\n externalAverage: number;\n /** Individual external scores */\n externalScores: ExternalScore[];\n /** Weights used */\n weights: AggregationWeights;\n /** Number of sources */\n sourceCount: number;\n}\n\n/**\n * ReputationBridge — import and aggregate reputation from external platforms.\n */\nexport class ReputationBridge {\n private readonly client: Invariance;\n private readonly externalScores = new Map<string, ExternalScore[]>();\n private weights: AggregationWeights = { invariance: 0.7, external: 0.3 };\n\n constructor(client: Invariance, weights?: Partial<AggregationWeights>) {\n this.client = client;\n if (weights) {\n this.weights = { ...this.weights, ...weights };\n }\n }\n\n /**\n * Import an external reputation score for an identity.\n */\n importExternalScore(identityId: string, score: ExternalScore): void {\n const existing = this.externalScores.get(identityId) ?? [];\n const idx = existing.findIndex((s) => s.platform === score.platform);\n if (idx >= 0) {\n existing[idx] = score;\n } else {\n existing.push(score);\n }\n this.externalScores.set(identityId, existing);\n }\n\n /**\n * Get external scores for an identity.\n */\n getExternalScores(identityId: string): ExternalScore[] {\n return this.externalScores.get(identityId) ?? [];\n }\n\n /**\n * Get aggregated reputation score combining Invariance + external sources.\n */\n async getAggregatedScore(identityId: string): Promise<AggregatedReputation> {\n const onChain = await this.client.reputation.get(identityId);\n const invarianceScore = (onChain as { scores?: { overall?: number }; overall?: number }).scores?.overall\n ?? (onChain as { overall?: number }).overall\n ?? 0;\n\n const externalScores = this.getExternalScores(identityId);\n const externalAverage = externalScores.length > 0\n ? externalScores.reduce((sum, s) => sum + s.score, 0) / externalScores.length\n : 0;\n\n const hasExternal = externalScores.length > 0;\n const score = hasExternal\n ? this.weights.invariance * invarianceScore + this.weights.external * externalAverage\n : invarianceScore;\n\n return {\n score: Math.round(score * 100) / 100,\n invarianceScore,\n externalAverage: Math.round(externalAverage * 100) / 100,\n externalScores,\n weights: this.weights,\n sourceCount: 1 + externalScores.length,\n };\n }\n\n /**\n * Update aggregation weights.\n */\n setWeights(weights: Partial<AggregationWeights>): void {\n this.weights = { ...this.weights, ...weights };\n }\n\n /**\n * Record external score as on-chain attestation.\n */\n async attestExternalScore(identityId: string, score: ExternalScore): Promise<string> {\n this.importExternalScore(identityId, score);\n\n const attestation = await this.client.identity.attest(identityId, {\n claim: `reputation:${score.platform}`,\n attester: identityId,\n evidence: JSON.stringify({\n score: score.score,\n proofUrl: score.proofUrl,\n fetchedAt: score.fetchedAt,\n }),\n });\n\n return attestation.txHash;\n }\n}\n","/**\n * Escrow with cross-chain policy enforcement.\n *\n * @example\n * ```typescript\n * const xEscrow = new CrossChainEscrow(inv);\n * const result = await xEscrow.create({\n * sourceChain: 'base',\n * destinationChain: 'optimism',\n * amount: '5000',\n * recipient: { type: 'agent', address: '0xAgent' },\n * perChainCap: '2500',\n * });\n * ```\n */\nimport type { Invariance } from '../core/InvarianceClient.js';\nimport type { EscrowContract, CreateEscrowOptions } from '../modules/escrow/types.js';\nimport type { SpecPolicy, PolicyRule } from '@invariance/common';\n\n/** Supported chain identifiers */\nexport type ChainId = 'base' | 'base-sepolia' | 'ethereum' | 'optimism' | 'arbitrum';\n\n/** Cross-chain escrow configuration */\nexport interface CrossChainEscrowOptions {\n /** Source chain where escrow is created */\n sourceChain: ChainId;\n /** Destination chain for the bridged action */\n destinationChain: ChainId;\n /** Escrow amount in USDC */\n amount: string;\n /** Recipient actor reference */\n recipient: { type: string; address: string };\n /** Per-chain spending cap */\n perChainCap?: string;\n /** Allowed bridge actions */\n allowedActions?: string[];\n /** Additional policy rules */\n additionalRules?: PolicyRule[];\n /** Escrow timeout (ISO 8601 duration) */\n timeout?: string;\n}\n\n/** Result of cross-chain escrow creation */\nexport interface CrossChainEscrowResult {\n /** Created escrow on source chain */\n escrow: EscrowContract;\n /** Attached bridge policy */\n policy: SpecPolicy;\n /** Source chain */\n sourceChain: ChainId;\n /** Destination chain */\n destinationChain: ChainId;\n}\n\n/**\n * CrossChainEscrow — escrow with cross-chain policy enforcement.\n */\nexport class CrossChainEscrow {\n private readonly client: Invariance;\n\n constructor(client: Invariance) {\n this.client = client;\n }\n\n /**\n * Create an escrow on the source chain with bridge-specific policy enforcement.\n */\n async create(opts: CrossChainEscrowOptions): Promise<CrossChainEscrowResult> {\n const rules: PolicyRule[] = [\n { type: 'max-spend', config: { amount: opts.perChainCap ?? opts.amount, period: '24h' } },\n {\n type: 'action-whitelist',\n config: { actions: opts.allowedActions ?? ['bridge', 'swap', 'approve', 'claim', 'query'] },\n },\n ];\n\n if (opts.additionalRules) {\n rules.push(...opts.additionalRules);\n }\n\n const policy = await this.client.policy.create({\n name: `xchain-${opts.sourceChain}-to-${opts.destinationChain}-${Date.now()}`,\n rules,\n });\n\n const escrow = await this.client.escrow.create({\n amount: opts.amount,\n recipient: opts.recipient as CreateEscrowOptions['recipient'],\n conditions: {\n type: 'task-completion',\n timeout: opts.timeout ?? 'P7D',\n },\n });\n\n return {\n escrow,\n policy,\n sourceChain: opts.sourceChain,\n destinationChain: opts.destinationChain,\n };\n }\n\n /**\n * Verify that a cross-chain action complies with the attached policy.\n */\n async verifyAction(\n policyId: string,\n action: string,\n actor: { type: string; address: string },\n params?: Record<string, unknown>,\n ): Promise<{ allowed: boolean; reason?: string }> {\n const evaluation = await this.client.policy.evaluate({\n policyId,\n actor: actor as Parameters<Invariance['policy']['evaluate']>[0]['actor'],\n action,\n params: params ?? {},\n });\n\n const result: { allowed: boolean; reason?: string } = { allowed: evaluation.allowed };\n if (!evaluation.allowed) {\n const reason = evaluation.ruleResults.find((r) => !r.passed)?.detail;\n if (reason) result.reason = reason;\n }\n return result;\n }\n}\n","/**\n * Time-expiring verification with sybil resistance.\n * Serves: Tinder+World ID, Hicky, Luna, Gitcoin Passport, Polygon ID, government ID programs.\n *\n * @example\n * ```typescript\n * const gatekeeper = new IdentityGatekeeper(inv);\n * const credential = await gatekeeper.verifyAndGate({\n * identityId: 'identity-123',\n * platform: 'world-id',\n * validityMs: 365 * 24 * 60 * 60 * 1000,\n * sybilResistant: true,\n * });\n * ```\n */\nimport type { Invariance } from '../core/InvarianceClient.js';\n\n/** Verification credential */\nexport interface VerificationCredential {\n /** Identity ID of the verified entity */\n identityId: string;\n /** Platform that issued the verification */\n platform: string;\n /** When the verification was issued (ms since epoch) */\n issuedAt: number;\n /** When the verification expires (ms since epoch) */\n expiresAt: number;\n /** Transaction hash of the attestation */\n txHash: string;\n /** Whether still valid */\n active: boolean;\n}\n\n/** Options for verifying and gating */\nexport interface VerifyAndGateOptions {\n /** Identity to verify */\n identityId: string;\n /** Platform name (e.g., 'world-id', 'polygon-id', 'civic') */\n platform: string;\n /** Verification validity duration in milliseconds (default: 365 days) */\n validityMs?: number;\n /** External proof (e.g., World ID proof, Polygon ID credential) */\n proof?: string;\n /** Enforce 1-identity-per-platform (default: true) */\n sybilResistant?: boolean;\n}\n\n/** Access log entry */\nexport interface AccessLogEntry {\n /** Who queried the identity data */\n queriedBy: string;\n /** Identity that was queried */\n identityId: string;\n /** What data was accessed */\n dataAccessed: string;\n /** Timestamp */\n timestamp: number;\n /** Ledger entry ID */\n entryId: string;\n}\n\n/**\n * IdentityGatekeeper — time-expiring verification with sybil resistance.\n */\nexport class IdentityGatekeeper {\n private readonly client: Invariance;\n private readonly platformRegistry = new Map<string, Set<string>>();\n private readonly credentials = new Map<string, VerificationCredential>();\n\n constructor(client: Invariance) {\n this.client = client;\n }\n\n /**\n * Verify an identity and issue a time-bounded credential.\n * Enforces 1-identity-per-platform when sybilResistant is true.\n */\n async verifyAndGate(opts: VerifyAndGateOptions): Promise<VerificationCredential> {\n const {\n identityId,\n platform,\n validityMs = 365 * 24 * 60 * 60 * 1000,\n sybilResistant = true,\n } = opts;\n\n // Check for existing valid credential\n if (sybilResistant) {\n const existing = this.platformRegistry.get(platform);\n if (existing?.has(identityId)) {\n const cred = this.credentials.get(`${identityId}:${platform}`);\n if (cred && cred.active && cred.expiresAt > Date.now()) {\n return cred;\n }\n }\n }\n\n const now = Date.now();\n const expiresAt = now + validityMs;\n\n const attestation = await this.client.identity.attest(identityId, {\n claim: `verification:${platform}`,\n attester: identityId,\n evidence: JSON.stringify({\n platform,\n issuedAt: now,\n expiresAt,\n proof: opts.proof,\n sybilResistant,\n }),\n });\n\n const credential: VerificationCredential = {\n identityId,\n platform,\n issuedAt: now,\n expiresAt,\n txHash: attestation.txHash,\n active: true,\n };\n\n this.credentials.set(`${identityId}:${platform}`, credential);\n if (sybilResistant) {\n if (!this.platformRegistry.has(platform)) {\n this.platformRegistry.set(platform, new Set());\n }\n this.platformRegistry.get(platform)!.add(identityId);\n }\n\n return credential;\n }\n\n /**\n * Check if an identity has valid (non-expired) verification.\n */\n isVerified(identityId: string, platform: string): boolean {\n const cred = this.credentials.get(`${identityId}:${platform}`);\n if (!cred) return false;\n return cred.active && cred.expiresAt > Date.now();\n }\n\n /**\n * Revoke expired verifications. Returns count of revoked credentials.\n */\n revokeExpired(platform?: string): number {\n let revoked = 0;\n const now = Date.now();\n\n for (const [key, cred] of this.credentials) {\n if (platform && cred.platform !== platform) continue;\n if (cred.active && cred.expiresAt <= now) {\n cred.active = false;\n this.credentials.set(key, cred);\n this.platformRegistry.get(cred.platform)?.delete(cred.identityId);\n revoked++;\n }\n }\n\n return revoked;\n }\n\n /**\n * Log an access event for GDPR compliance.\n */\n async accessLog(\n queriedBy: string,\n identityId: string,\n dataAccessed: string,\n ): Promise<AccessLogEntry> {\n const entry = await this.client.ledger.log({\n action: 'identity-access',\n actor: { type: 'service' as const, address: queriedBy },\n category: 'custom',\n metadata: { identityId, dataAccessed, queriedBy, purpose: 'identity-verification-access' },\n });\n\n return {\n queriedBy,\n identityId,\n dataAccessed,\n timestamp: Date.now(),\n entryId: entry.entryId,\n };\n }\n\n /**\n * Get all active credentials for an identity.\n */\n getCredentials(identityId: string): VerificationCredential[] {\n const results: VerificationCredential[] = [];\n for (const [key, cred] of this.credentials) {\n if (key.startsWith(`${identityId}:`) && cred.active) {\n results.push(cred);\n }\n }\n return results;\n }\n}\n","/**\n * Dual-identity verification (device + human) with confidence thresholds.\n * Serves: Neuralink, Merge Labs, and future BCI platforms.\n *\n * @example\n * ```typescript\n * const bci = new BCIIntentVerifier(inv, { autoApprove: 0.95, humanReview: 0.7, deny: 0.3 });\n * const result = await bci.verifyIntent({\n * deviceId: 'device-neuralink-001',\n * humanId: 'identity-user-123',\n * confidence: 0.92,\n * action: 'transfer',\n * params: { to: '0xRecipient', amount: '100' },\n * });\n * ```\n */\nimport type { Invariance } from '../core/InvarianceClient.js';\n\n/** BCI signal with confidence score */\nexport interface BCISignal {\n /** Device identity ID */\n deviceId: string;\n /** Human identity ID */\n humanId: string;\n /** Neural confidence score (0.0 - 1.0) */\n confidence: number;\n /** Intended action */\n action: string;\n /** Action parameters */\n params: Record<string, unknown>;\n /** Raw signal metadata */\n signalMetadata?: Record<string, unknown>;\n}\n\n/** Confidence threshold configuration */\nexport interface ConfidenceThresholds {\n /** Minimum confidence for auto-approval (default: 0.95) */\n autoApprove: number;\n /** Minimum confidence for human-in-the-loop approval (default: 0.7) */\n humanReview: number;\n /** Below this, action is denied (default: 0.3) */\n deny: number;\n}\n\n/** BCI verification result */\nexport interface BCIVerificationResult {\n /** Whether the action is approved */\n approved: boolean;\n /** Approval method used */\n method: 'auto' | 'human-review' | 'denied';\n /** Confidence score */\n confidence: number;\n /** Reason for decision */\n reason: string;\n /** Ledger entry for audit trail */\n auditEntryId?: string;\n /** Transaction hash */\n txHash?: string;\n}\n\n/**\n * BCIIntentVerifier — dual-identity verification for brain-computer interfaces.\n */\nexport class BCIIntentVerifier {\n private readonly client: Invariance;\n private readonly thresholds: ConfidenceThresholds;\n private readonly highStakesActions: Set<string>;\n\n constructor(\n client: Invariance,\n thresholds?: Partial<ConfidenceThresholds>,\n highStakesActions?: string[],\n ) {\n this.client = client;\n this.thresholds = {\n autoApprove: thresholds?.autoApprove ?? 0.95,\n humanReview: thresholds?.humanReview ?? 0.7,\n deny: thresholds?.deny ?? 0.3,\n };\n this.highStakesActions = new Set(highStakesActions ?? [\n 'transfer-large',\n 'delete-account',\n 'grant-access',\n 'revoke-all',\n ]);\n }\n\n /**\n * Verify a BCI intent signal with dual-identity check and confidence gating.\n */\n async verifyIntent(signal: BCISignal): Promise<BCIVerificationResult> {\n const { confidence, action } = signal;\n\n // Validate both identities exist\n const [device, human] = await Promise.all([\n this.client.identity.get(signal.deviceId),\n this.client.identity.get(signal.humanId),\n ]);\n\n if (!device || !human) {\n return {\n approved: false,\n method: 'denied',\n confidence,\n reason: `Identity not found: ${!device ? signal.deviceId : signal.humanId}`,\n };\n }\n\n let method: BCIVerificationResult['method'];\n let approved: boolean;\n let reason: string;\n\n if (confidence < this.thresholds.deny) {\n method = 'denied';\n approved = false;\n reason = `Confidence ${confidence} below deny threshold ${this.thresholds.deny}`;\n } else if (this.highStakesActions.has(action) || confidence < this.thresholds.autoApprove) {\n method = 'human-review';\n approved = confidence >= this.thresholds.humanReview;\n reason = this.highStakesActions.has(action)\n ? `High-stakes action '${action}' requires human review (confidence: ${confidence})`\n : `Confidence ${confidence} requires human review (threshold: ${this.thresholds.autoApprove})`;\n } else {\n method = 'auto';\n approved = true;\n reason = `Confidence ${confidence} meets auto-approve threshold ${this.thresholds.autoApprove}`;\n }\n\n // Log to immutable audit trail\n const entry = await this.client.ledger.log({\n action: 'bci-intent-verification',\n actor: { type: 'device' as const, address: device.address },\n category: 'custom',\n metadata: {\n humanId: signal.humanId,\n deviceId: signal.deviceId,\n confidence,\n intendedAction: action,\n method,\n approved,\n reason,\n signalMetadata: signal.signalMetadata,\n },\n });\n\n return {\n approved,\n method,\n confidence,\n reason,\n auditEntryId: entry.entryId,\n txHash: entry.txHash,\n };\n }\n\n /**\n * Update confidence thresholds.\n */\n setThresholds(thresholds: Partial<ConfidenceThresholds>): void {\n Object.assign(this.thresholds, thresholds);\n }\n\n /**\n * Add actions to the high-stakes list.\n */\n addHighStakesActions(actions: string[]): void {\n for (const action of actions) {\n this.highStakesActions.add(action);\n }\n }\n\n /**\n * Get current threshold configuration.\n */\n getThresholds(): ConfidenceThresholds {\n return { ...this.thresholds };\n }\n}\n","/**\n * Beneficiary-gated bot registration + extraction logging.\n * Serves: MEV bots, DeFi arbitrage, liquidation systems.\n *\n * @example\n * ```typescript\n * const mev = new MEVComplianceKit(inv);\n * const bot = await mev.registerBot({\n * identity: { type: 'agent', owner: '0xDev', label: 'ArbBot-1' },\n * beneficiaries: ['0xTreasury', '0xDAO'],\n * maxExtractionPerTx: '1000',\n * maxDailyExtraction: '50000',\n * allowedStrategies: ['arbitrage', 'liquidation'],\n * });\n * ```\n */\nimport type { Invariance } from '../core/InvarianceClient.js';\nimport type { Identity } from '../modules/identity/types.js';\nimport type { SpecPolicy, PolicyRule } from '@invariance/common';\n\n/** MEV bot registration options */\nexport interface RegisterBotOptions {\n /** Bot identity details */\n identity: {\n type: 'agent';\n owner: string;\n label: string;\n metadata?: Record<string, unknown>;\n };\n /** Allowed beneficiary addresses */\n beneficiaries: string[];\n /** Maximum extraction per transaction */\n maxExtractionPerTx?: string;\n /** Maximum daily extraction */\n maxDailyExtraction?: string;\n /** Allowed MEV strategies */\n allowedStrategies?: string[];\n}\n\n/** Registered bot result */\nexport interface RegisteredBot {\n /** Bot identity */\n identity: Identity;\n /** Attached compliance policy */\n policy: SpecPolicy;\n /** Registered beneficiaries */\n beneficiaries: string[];\n}\n\n/** MEV extraction log entry */\nexport interface ExtractionLog {\n /** Ledger entry ID */\n entryId: string;\n /** Transaction hash */\n txHash: string;\n /** Strategy used */\n strategy: string;\n /** Amount extracted (USDC) */\n amount: string;\n /** Beneficiary address */\n beneficiary: string;\n /** Timestamp */\n timestamp: number;\n}\n\n/**\n * MEVComplianceKit — beneficiary-gated bot registration + extraction logging.\n */\nexport class MEVComplianceKit {\n private readonly client: Invariance;\n private readonly beneficiaryRegistry = new Map<string, Set<string>>();\n\n constructor(client: Invariance) {\n this.client = client;\n }\n\n /**\n * Register a MEV bot with beneficiary gates and extraction limits.\n */\n async registerBot(opts: RegisterBotOptions): Promise<RegisteredBot> {\n const { metadata, ...restIdentity } = opts.identity;\n const identityMetadata = metadata\n ? Object.fromEntries(Object.entries(metadata).map(([k, v]) => [k, String(v)]))\n : undefined;\n const identity = await this.client.identity.register(\n identityMetadata ? { ...restIdentity, metadata: identityMetadata } : restIdentity,\n );\n\n const rules: PolicyRule[] = [];\n if (opts.maxExtractionPerTx) {\n rules.push({ type: 'max-spend', config: { amount: opts.maxExtractionPerTx } });\n }\n if (opts.maxDailyExtraction) {\n rules.push({ type: 'max-spend', config: { amount: opts.maxDailyExtraction, period: '24h' } });\n }\n if (opts.allowedStrategies) {\n rules.push({ type: 'action-whitelist', config: { actions: opts.allowedStrategies } });\n }\n\n const policy = await this.client.policy.create({\n name: `mev-compliance-${opts.identity.label}`,\n rules,\n });\n\n await this.client.policy.attach(policy.policyId, identity.identityId);\n this.beneficiaryRegistry.set(identity.identityId, new Set(opts.beneficiaries));\n\n await this.client.identity.attest(identity.identityId, {\n claim: 'mev:beneficiaries',\n attester: identity.identityId,\n evidence: JSON.stringify(opts.beneficiaries),\n });\n\n return { identity, policy, beneficiaries: opts.beneficiaries };\n }\n\n /**\n * Verify that an extraction targets an approved beneficiary.\n */\n isBeneficiaryApproved(botIdentityId: string, beneficiary: string): boolean {\n return this.beneficiaryRegistry.get(botIdentityId)?.has(beneficiary) ?? false;\n }\n\n /**\n * Log an MEV extraction event to the immutable ledger.\n */\n async logExtraction(\n botIdentityId: string,\n extraction: { strategy: string; amount: string; beneficiary: string; metadata?: Record<string, unknown> },\n ): Promise<ExtractionLog> {\n if (!this.isBeneficiaryApproved(botIdentityId, extraction.beneficiary)) {\n throw new Error(`Beneficiary '${extraction.beneficiary}' not approved for bot '${botIdentityId}'`);\n }\n\n const bot = await this.client.identity.get(botIdentityId);\n const entry = await this.client.ledger.log({\n action: 'mev-extraction',\n actor: { type: 'agent' as const, address: bot.address },\n category: 'custom',\n metadata: {\n strategy: extraction.strategy,\n amount: extraction.amount,\n beneficiary: extraction.beneficiary,\n botIdentityId,\n ...extraction.metadata,\n },\n });\n\n return {\n entryId: entry.entryId,\n txHash: entry.txHash,\n strategy: extraction.strategy,\n amount: extraction.amount,\n beneficiary: extraction.beneficiary,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Add a beneficiary to an existing bot.\n */\n addBeneficiary(botIdentityId: string, beneficiary: string): void {\n if (!this.beneficiaryRegistry.has(botIdentityId)) {\n this.beneficiaryRegistry.set(botIdentityId, new Set());\n }\n this.beneficiaryRegistry.get(botIdentityId)!.add(beneficiary);\n }\n\n /**\n * Remove a beneficiary from an existing bot.\n */\n removeBeneficiary(botIdentityId: string, beneficiary: string): boolean {\n return this.beneficiaryRegistry.get(botIdentityId)?.delete(beneficiary) ?? false;\n }\n\n /**\n * Get all approved beneficiaries for a bot.\n */\n getBeneficiaries(botIdentityId: string): string[] {\n return [...(this.beneficiaryRegistry.get(botIdentityId) ?? [])];\n }\n}\n","/**\n * Role-based procurement + benefits distribution.\n * Serves: DOGE, government procurement, benefits distribution programs.\n *\n * @example\n * ```typescript\n * const gov = new GovernmentComplianceKit(inv);\n * const agency = await gov.setupAgency({\n * name: 'DOT',\n * identity: { type: 'service', owner: '0xGov', label: 'Dept-of-Transportation' },\n * roles: [\n * { name: 'officer', maxSpend: '100000', allowedActions: ['approve', 'procure', 'audit'] },\n * { name: 'vendor', maxSpend: '0', allowedActions: ['bid', 'deliver', 'invoice'] },\n * ],\n * agencyCap: '10000000',\n * });\n * ```\n */\nimport type { Invariance } from '../core/InvarianceClient.js';\nimport type { Identity } from '../modules/identity/types.js';\nimport type { SpecPolicy, PolicyRule } from '@invariance/common';\nimport type { EscrowContract } from '../modules/escrow/types.js';\n\n/** Agency role with permission matrix */\nexport interface AgencyRole {\n /** Role name (e.g., 'procurement-officer', 'auditor', 'vendor') */\n name: string;\n /** Maximum spending authority */\n maxSpend: string;\n /** Allowed actions */\n allowedActions: string[];\n /** Approval required above this amount */\n approvalThreshold?: string;\n}\n\n/** Options for setting up an agency */\nexport interface SetupAgencyOptions {\n /** Agency name */\n name: string;\n /** Agency identity details */\n identity: {\n type: 'service';\n owner: string;\n label: string;\n metadata?: Record<string, unknown>;\n };\n /** Role definitions */\n roles: AgencyRole[];\n /** Agency-wide spending cap */\n agencyCap: string;\n}\n\n/** Agency setup result */\nexport interface AgencySetupResult {\n /** Agency identity */\n identity: Identity;\n /** Agency-wide policy */\n policy: SpecPolicy;\n /** Role policies */\n rolePolicies: Map<string, SpecPolicy>;\n}\n\n/** Milestone for escrow release */\nexport interface Milestone {\n /** Milestone description */\n description: string;\n /** Amount to release on completion */\n amount: string;\n /** Verifier identity ID */\n verifier: string;\n}\n\n/** Milestone escrow result */\nexport interface MilestoneEscrowResult {\n /** Created escrow */\n escrow: EscrowContract;\n /** Policy for milestone verification */\n policy: SpecPolicy;\n /** Milestones registered */\n milestones: Milestone[];\n}\n\n/** Benefits distribution options */\nexport interface DistributeBenefitsOptions {\n /** Program name */\n program: string;\n /** Recipient identity IDs */\n recipients: string[];\n /** Amount per recipient */\n amountPerRecipient: string;\n /** Maximum total distribution */\n maxTotal: string;\n /** Require eligibility verification */\n requireEligibility?: boolean;\n}\n\n/** Distribution result */\nexport interface DistributionResult {\n /** Number of successful distributions */\n successCount: number;\n /** Total amount distributed */\n totalDistributed: string;\n /** Ledger entries for audit trail */\n auditEntries: string[];\n /** Failed distributions */\n failures: Array<{ recipientId: string; reason: string }>;\n}\n\n/**\n * GovernmentComplianceKit — role-based procurement + benefits distribution.\n */\nexport class GovernmentComplianceKit {\n private readonly client: Invariance;\n\n constructor(client: Invariance) {\n this.client = client;\n }\n\n /**\n * Register an agency identity with role-based permission matrix.\n */\n async setupAgency(opts: SetupAgencyOptions): Promise<AgencySetupResult> {\n const { metadata, ...restIdentity } = opts.identity;\n const identityMetadata = metadata\n ? Object.fromEntries(Object.entries(metadata).map(([k, v]) => [k, String(v)]))\n : undefined;\n\n const identity = await this.client.identity.register(\n identityMetadata ? { ...restIdentity, metadata: identityMetadata } : { ...restIdentity },\n );\n\n const policy = await this.client.policy.create({\n name: `agency-${opts.name}`,\n rules: [{ type: 'max-spend', config: { amount: opts.agencyCap, period: '24h' } }],\n });\n\n await this.client.policy.attach(policy.policyId, identity.identityId);\n\n const rolePolicies = new Map<string, SpecPolicy>();\n for (const role of opts.roles) {\n const roleRules: PolicyRule[] = [\n { type: 'max-spend', config: { amount: role.maxSpend, period: '24h' } },\n { type: 'action-whitelist', config: { actions: role.allowedActions } },\n ];\n\n const rolePolicy = await this.client.policy.create({\n name: `agency-${opts.name}-role-${role.name}`,\n rules: roleRules,\n });\n\n rolePolicies.set(role.name, rolePolicy);\n }\n\n return { identity, policy, rolePolicies };\n }\n\n /**\n * Create milestone-based escrow for procurement contracts.\n */\n async milestoneEscrow(\n contractName: string,\n totalAmount: string,\n milestones: Milestone[],\n signers: string[],\n threshold: number,\n ): Promise<MilestoneEscrowResult> {\n if (!signers.length) {\n throw new Error('signers array must contain at least one signer');\n }\n const primarySigner = signers[0]!;\n\n const escrow = await this.client.createMultiSig({\n amount: totalAmount,\n recipient: { type: 'service', address: primarySigner },\n signers,\n threshold,\n timeout: 'P90D',\n });\n\n const policy = await this.client.policy.create({\n name: `procurement-${contractName}`,\n rules: [\n { type: 'max-spend', config: { amount: totalAmount } },\n { type: 'action-whitelist', config: { actions: ['verify-milestone', 'release', 'audit'] } },\n ],\n });\n\n for (const milestone of milestones) {\n await this.client.ledger.log({\n action: 'milestone-registered',\n actor: { type: 'service' as const, address: primarySigner },\n category: 'custom',\n metadata: {\n contractName,\n escrowId: escrow.escrowId,\n milestone: milestone.description,\n amount: milestone.amount,\n verifier: milestone.verifier,\n },\n });\n }\n\n return { escrow, policy, milestones };\n }\n\n /**\n * Distribute benefits with eligibility gates and per-citizen caps.\n */\n async distributeBenefits(opts: DistributeBenefitsOptions): Promise<DistributionResult> {\n const auditEntries: string[] = [];\n const failures: DistributionResult['failures'] = [];\n let successCount = 0;\n let totalDistributed = 0;\n const perRecipient = parseFloat(opts.amountPerRecipient);\n const maxTotal = parseFloat(opts.maxTotal);\n\n for (const recipientId of opts.recipients) {\n if (totalDistributed + perRecipient > maxTotal) {\n failures.push({ recipientId, reason: 'Maximum total distribution reached' });\n continue;\n }\n\n try {\n if (opts.requireEligibility) {\n await this.client.identity.get(recipientId);\n }\n\n const entry = await this.client.ledger.log({\n action: 'benefits-distribution',\n actor: { type: 'service' as const, address: recipientId },\n category: 'custom',\n metadata: {\n program: opts.program,\n recipientId,\n amount: opts.amountPerRecipient,\n distributedAt: Date.now(),\n },\n });\n\n auditEntries.push(entry.entryId);\n successCount++;\n totalDistributed += perRecipient;\n } catch (error) {\n failures.push({\n recipientId,\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return {\n successCount,\n totalDistributed: totalDistributed.toString(),\n auditEntries,\n failures,\n };\n }\n\n /**\n * Create immutable compliance attestation.\n */\n async complianceAttestation(\n agencyIdentityId: string,\n regulation: string,\n details: Record<string, unknown>,\n ): Promise<{ txHash: string }> {\n const attestation = await this.client.identity.attest(agencyIdentityId, {\n claim: `compliance:${regulation}`,\n attester: agencyIdentityId,\n evidence: JSON.stringify({ regulation, attestedAt: Date.now(), ...details }),\n });\n\n return { txHash: attestation.txHash };\n }\n}\n","/**\n * Agent/user relationship tracking via attestations.\n * BFS traversal of social connections for trust graphs.\n *\n * @example\n * ```typescript\n * const graph = new SocialGraphAdapter(inv);\n * await graph.linkAgents('identity-a', 'identity-b', 'trusts', 0.9);\n * const trust = graph.getTrustGraph('identity-a', 3);\n * ```\n */\nimport type { Invariance } from '../core/InvarianceClient.js';\n\n/** A link between two identities */\nexport interface SocialLink {\n /** Source identity ID */\n from: string;\n /** Target identity ID */\n to: string;\n /** Relationship type (e.g., 'trusts', 'delegates-to', 'collaborates-with') */\n relationship: string;\n /** Link strength (0.0 - 1.0) */\n strength: number;\n /** When the link was created */\n createdAt: number;\n /** Transaction hash of the attestation */\n txHash: string;\n}\n\n/** Trust graph node */\nexport interface TrustNode {\n /** Identity ID */\n identityId: string;\n /** Distance from the origin (in hops) */\n depth: number;\n /** Aggregated trust score at this depth */\n trustScore: number;\n /** Incoming links */\n incomingLinks: SocialLink[];\n}\n\n/** Trust graph result */\nexport interface TrustGraph {\n /** Origin identity */\n origin: string;\n /** All reachable nodes */\n nodes: TrustNode[];\n /** Total edges traversed */\n edgeCount: number;\n /** Maximum depth reached */\n maxDepth: number;\n}\n\n/**\n * SocialGraphAdapter — agent/user relationship tracking and trust graph traversal.\n */\nexport class SocialGraphAdapter {\n private readonly client: Invariance;\n private readonly adjacency = new Map<string, SocialLink[]>();\n\n constructor(client: Invariance) {\n this.client = client;\n }\n\n /**\n * Create a link between two identities with on-chain attestation.\n */\n async linkAgents(\n fromId: string,\n toId: string,\n relationship: string,\n strength: number,\n ): Promise<SocialLink> {\n if (strength < 0 || strength > 1) {\n throw new Error('Strength must be between 0.0 and 1.0');\n }\n\n const attestation = await this.client.identity.attest(fromId, {\n claim: `social:${relationship}:${toId}`,\n attester: fromId,\n evidence: JSON.stringify({ relationship, strength, target: toId }),\n });\n\n const link: SocialLink = {\n from: fromId,\n to: toId,\n relationship,\n strength,\n createdAt: Date.now(),\n txHash: attestation.txHash,\n };\n\n const existing = this.adjacency.get(fromId) ?? [];\n const idx = existing.findIndex((l) => l.to === toId && l.relationship === relationship);\n if (idx >= 0) {\n existing[idx] = link;\n } else {\n existing.push(link);\n }\n this.adjacency.set(fromId, existing);\n\n return link;\n }\n\n /**\n * Remove a link between two identities.\n */\n unlinkAgents(fromId: string, toId: string, relationship: string): boolean {\n const links = this.adjacency.get(fromId);\n if (!links) return false;\n const idx = links.findIndex((l) => l.to === toId && l.relationship === relationship);\n if (idx < 0) return false;\n links.splice(idx, 1);\n return true;\n }\n\n /**\n * Get direct links from an identity.\n */\n getLinks(identityId: string): SocialLink[] {\n return this.adjacency.get(identityId) ?? [];\n }\n\n /**\n * BFS traversal to build a trust graph from an origin identity.\n */\n getTrustGraph(origin: string, maxDepth: number = 3, minStrength: number = 0.1): TrustGraph {\n const visited = new Map<string, TrustNode>();\n const queue: Array<{ id: string; depth: number; trustScore: number }> = [\n { id: origin, depth: 0, trustScore: 1.0 },\n ];\n let edgeCount = 0;\n let actualMaxDepth = 0;\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (visited.has(current.id)) continue;\n if (current.depth > maxDepth) continue;\n\n actualMaxDepth = Math.max(actualMaxDepth, current.depth);\n\n // Find incoming links\n const incomingLinks: SocialLink[] = [];\n for (const [, links] of this.adjacency) {\n for (const link of links) {\n if (link.to === current.id) {\n incomingLinks.push(link);\n }\n }\n }\n\n visited.set(current.id, {\n identityId: current.id,\n depth: current.depth,\n trustScore: Math.round(current.trustScore * 1000) / 1000,\n incomingLinks,\n });\n\n // Enqueue neighbors\n const outLinks = this.adjacency.get(current.id) ?? [];\n for (const link of outLinks) {\n if (!visited.has(link.to) && link.strength >= minStrength) {\n edgeCount++;\n queue.push({\n id: link.to,\n depth: current.depth + 1,\n trustScore: current.trustScore * link.strength,\n });\n }\n }\n }\n\n return {\n origin,\n nodes: [...visited.values()],\n edgeCount,\n maxDepth: actualMaxDepth,\n };\n }\n\n /**\n * Get mutual connections between two identities.\n */\n getMutualConnections(idA: string, idB: string): string[] {\n const aTargets = new Set((this.adjacency.get(idA) ?? []).map((l) => l.to));\n const bTargets = (this.adjacency.get(idB) ?? []).map((l) => l.to);\n return bTargets.filter((t) => aTargets.has(t));\n }\n}\n","/**\n * @invariance/sdk\n *\n * TypeScript SDK for Invariance Protocol - universal verification framework\n * for agents, humans, and devices.\n *\n * @example\n * ```typescript\n * import { Invariance } from '@invariance/sdk';\n *\n * const inv = new Invariance({\n * chain: 'base',\n * rpcUrl: 'https://mainnet.base.org',\n * signer: wallet,\n * });\n *\n * // Register an identity\n * const agent = await inv.identity.register({\n * type: 'agent',\n * owner: '0xDev',\n * label: 'TraderBot',\n * });\n *\n * // Execute a verified intent\n * const result = await inv.intent.request({\n * actor: { type: 'agent', address: agent.address },\n * action: 'swap',\n * params: { from: 'USDC', to: 'ETH', amount: '100' },\n * approval: 'auto',\n * });\n *\n * // Verify any transaction\n * const verification = await inv.verify('0xtxhash...');\n * ```\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Main Client\n// ============================================================================\n\nexport { Invariance, SDK_VERSION } from './core/InvarianceClient.js';\nexport type { VerifyProxy } from './core/InvarianceClient.js';\n\n// ============================================================================\n// Convenience Types\n// ============================================================================\n\nexport type {\n QuickSetupOptions,\n QuickSetupResult,\n HireAndFundOptions,\n BatchRegisterOptions,\n BatchRegisterEntry,\n BatchAgentOptions,\n ExecuteAndLogOptions,\n ExecuteAndLogResult,\n RecurringPaymentOptions,\n CreateMultiSigOptions,\n SetupRateLimitedAgentOptions,\n HireAndReviewOptions,\n HireAndReviewResult,\n AuditOptions,\n AuditReport,\n DelegateOptions,\n DelegateResult,\n DeferredOperation,\n BatchOptions,\n BatchResult,\n SessionOptions,\n PipelineStep,\n PipelineResult,\n} from './core/convenience-types.js';\n\n// ============================================================================\n// Convenience Layer — New Classes\n// ============================================================================\n\nexport { BatchExecutor } from './core/BatchExecutor.js';\nexport { SessionContext } from './core/SessionContext.js';\nexport { PipelineBuilder } from './core/PipelineBuilder.js';\nexport { LedgerAnalytics } from './modules/ledger/LedgerAnalytics.js';\n\n// ============================================================================\n// Core Infrastructure\n// ============================================================================\n\n/** @internal */\nexport { ContractFactory } from './core/ContractFactory.js';\n/** @internal */\nexport { InvarianceEventEmitter } from './core/EventEmitter.js';\nexport type { InvarianceEvents } from './core/EventEmitter.js';\n/** @internal */\nexport { Telemetry } from './core/Telemetry.js';\n\n// ============================================================================\n// Errors\n// ============================================================================\n\nexport { InvarianceError } from './errors/InvarianceError.js';\nexport { ErrorCode } from '@invariance/common';\n\n// ============================================================================\n// Module Managers\n// ============================================================================\n\nexport { IdentityManager } from './modules/identity/IdentityManager.js';\nexport { WalletManager } from './modules/wallet/WalletManager.js';\nexport { IntentProtocol } from './modules/intent/IntentProtocol.js';\nexport { PolicyEngine } from './modules/policy/PolicyEngine.js';\nexport { EscrowManager } from './modules/escrow/EscrowManager.js';\nexport { EventLedger } from './modules/ledger/EventLedger.js';\nexport { EventLedgerCompact } from './modules/ledger/EventLedgerCompact.js';\nexport { AutoBatchedEventLedgerCompact } from './modules/ledger/AutoBatchedEventLedgerCompact.js';\nexport { Verifier } from './modules/verify/Verifier.js';\nexport { AtomicVerifier } from './modules/verify/AtomicVerifier.js';\nexport { ReputationEngine } from './modules/reputation/ReputationEngine.js';\nexport { GasManager } from './modules/gas/GasManager.js';\nexport { MarketplaceKit } from './modules/marketplace/MarketplaceKit.js';\nexport { AuditTrail } from './modules/audit/AuditTrail.js';\n\n// ============================================================================\n// Module Types — Identity\n// ============================================================================\n\nexport type {\n RegisterIdentityOptions,\n Identity,\n Attestation,\n PauseResult,\n ActorReference,\n} from './modules/identity/types.js';\nexport type {\n IdentityListFilters,\n AttestationInput,\n UpdateIdentityOptions,\n} from './modules/identity/types.js';\n\n// ============================================================================\n// Module Types — Wallet\n// ============================================================================\n\nexport type {\n WalletInfo,\n BalanceInfo,\n FundOptions,\n CreateWalletOptions,\n} from './modules/wallet/types.js';\nexport type { WalletProvider, ConnectOptions } from './modules/wallet/types.js';\n\n// ============================================================================\n// Module Types — Intent\n// ============================================================================\n\nexport type {\n IntentRequestOptions,\n IntentResult,\n PreparedIntent,\n IntentStatus,\n IntentLifecycle,\n ApprovalResult,\n ApprovalMethod,\n ProofBundle,\n GasEstimate,\n} from './modules/intent/types.js';\nexport type { IntentHistoryFilters, RetryConfig, RetryResult } from './modules/intent/types.js';\n\n// ============================================================================\n// Module Types — Policy\n// ============================================================================\n\nexport type {\n CreatePolicyOptions,\n PolicyRule,\n PolicyRuleType,\n SpecPolicy,\n PolicyStatus,\n EvaluationResult,\n} from './modules/policy/types.js';\nexport type {\n EvaluateOptions,\n PolicyListFilters,\n PolicyViolationCallback,\n PolicyTemplate,\n BuiltInTemplate,\n} from './modules/policy/types.js';\n\n// ============================================================================\n// Module Types — Escrow\n// ============================================================================\n\nexport type {\n CreateEscrowOptions,\n EscrowContract,\n EscrowState,\n EscrowStatus,\n EscrowConditions,\n ApprovalStatus,\n ResolveOptions,\n} from './modules/escrow/types.js';\nexport type {\n EscrowListFilters,\n EscrowStateChangeCallback,\n ReleaseOptions,\n} from './modules/escrow/types.js';\n\n// ============================================================================\n// Module Types — Ledger\n// ============================================================================\n\nexport type {\n LedgerEventInput,\n LedgerEntry,\n LedgerQueryFilters,\n} from './modules/ledger/types.js';\nexport type { LedgerStreamCallback, AutoBatchConfig } from './modules/ledger/types.js';\nexport type {\n AnalyticsTimeframe,\n SuccessRateResult,\n ActionCountResult,\n CostSummaryResult,\n ViolationResult,\n} from './modules/ledger/types.js';\n\n// ============================================================================\n// Module Types — Audit\n// ============================================================================\n\nexport type {\n AuditConfig,\n AuditLogInput,\n AuditLogMode,\n AuditLogRecord,\n AuditQueryFilters,\n AuditVisibility,\n GateActionOptions,\n GateActionResult,\n} from './modules/audit/types.js';\n\n// ============================================================================\n// Module Types — Verify\n// ============================================================================\n\nexport type {\n VerificationResult,\n IdentityVerification,\n EscrowVerification,\n} from './modules/verify/types.js';\nexport type { ProofData, VerifyActionOptions } from './modules/verify/types.js';\n\n// ============================================================================\n// Module Types — Reputation\n// ============================================================================\n\nexport type {\n ReputationScore,\n ReputationProfile,\n OnChainMetrics,\n SubmitReviewOptions,\n Review,\n ReviewSummary,\n Badge,\n ComparisonResult,\n ScoreHistory,\n ScoreHistoryEntry,\n} from './modules/reputation/types.js';\nexport type {\n ReviewQueryOptions,\n ReviewList,\n ScoreHistoryOptions,\n} from './modules/reputation/types.js';\n\n// ============================================================================\n// Module Types — Marketplace\n// ============================================================================\n\nexport type {\n RegisterListingOptions,\n Listing,\n ListingCategory,\n PricingModel,\n SearchQuery,\n SearchResults,\n HireOptions,\n HireResult,\n CompletionResult,\n} from './modules/marketplace/types.js';\nexport type {\n UpdateListingOptions,\n FeaturedOptions,\n CompleteHireOptions,\n} from './modules/marketplace/types.js';\n\n// ============================================================================\n// Module Types — Gas\n// ============================================================================\n\nexport type { GasBalance } from './modules/gas/types.js';\nexport type { EstimateGasOptions } from './modules/gas/types.js';\n\n// ============================================================================\n// Module Types — X402\n// ============================================================================\n\nexport { X402Manager } from './modules/x402/X402Manager.js';\nexport type {\n PayForActionOptions,\n PaymentReceipt,\n PaymentVerification,\n PaymentHistoryFilters,\n PaymentEstimate,\n X402Settings,\n} from './modules/x402/types.js';\n\n// ============================================================================\n// Module — ERC-8004 (Trustless Agents)\n// ============================================================================\n\nexport { ERC8004Manager, ERC8004Error } from './modules/erc8004/ERC8004Manager.js';\nexport { InvarianceBridge as ERC8004Bridge } from './modules/erc8004/InvarianceBridge.js';\nexport type {\n ERC8004Config,\n ERC8004RegistryAddresses,\n ERC8004AgentIdentity,\n ERC8004Metadata,\n GiveFeedbackOptions,\n ERC8004Feedback,\n ERC8004ReputationSummary,\n ReputationSummaryFilterOptions,\n ValidationRequestOptions,\n ValidationResponseOptions,\n ERC8004ValidationStatus,\n ERC8004ValidationSummary,\n ValidationSummaryFilterOptions,\n LinkedIdentity,\n ExternalReputationSignal,\n PushFeedbackOptions,\n} from './modules/erc8004/types.js';\nexport { isERC8004Supported, getERC8004Addresses } from './modules/erc8004/addresses.js';\n\n// ============================================================================\n// Common Types (re-exported for convenience)\n// ============================================================================\n\nexport type {\n InvarianceConfig,\n TxReceipt,\n Unsubscribe,\n ExportData,\n ActorType,\n ChainConfig,\n ContractAddresses,\n} from '@invariance/common';\nexport type { EIP1193Provider, InvarianceSigner } from '@invariance/common';\nexport type { PaymentOptions, RequirePaymentConfig, PaymentGatedAuthorization } from '@invariance/common';\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nexport { verifyWebhookSignature } from './utils/webhook.js';\n\n// ============================================================================\n// Platform Adapters\n// ============================================================================\n\nexport { RuntimeHookAdapter } from './adapters/RuntimeHookAdapter.js';\nexport type {\n ActionContext,\n BeforeActionResult,\n AfterActionResult,\n RuntimeHooks,\n} from './adapters/RuntimeHookAdapter.js';\n\nexport { MultiAgentComposer } from './adapters/MultiAgentComposer.js';\nexport type {\n CrewRole,\n CrewMember,\n SetupCrewOptions,\n CrewSetupResult,\n} from './adapters/MultiAgentComposer.js';\n\nexport { MarketplacePlugin } from './adapters/MarketplacePlugin.js';\nexport type {\n PublishAgentOptions,\n PublishResult,\n HireWithEscrowOptions,\n} from './adapters/MarketplacePlugin.js';\n\nexport { ReputationBridge } from './adapters/ReputationBridge.js';\nexport type {\n ExternalScore,\n AggregationWeights,\n AggregatedReputation,\n} from './adapters/ReputationBridge.js';\n\nexport { CrossChainEscrow } from './adapters/CrossChainEscrow.js';\nexport type {\n ChainId,\n CrossChainEscrowOptions,\n CrossChainEscrowResult,\n} from './adapters/CrossChainEscrow.js';\n\nexport { IdentityGatekeeper } from './adapters/IdentityGatekeeper.js';\nexport type {\n VerificationCredential,\n VerifyAndGateOptions,\n AccessLogEntry,\n} from './adapters/IdentityGatekeeper.js';\n\nexport { BCIIntentVerifier } from './adapters/BCIIntentVerifier.js';\nexport type {\n BCISignal,\n ConfidenceThresholds,\n BCIVerificationResult,\n} from './adapters/BCIIntentVerifier.js';\n\nexport { MEVComplianceKit } from './adapters/MEVComplianceKit.js';\nexport type {\n RegisterBotOptions,\n RegisteredBot,\n ExtractionLog,\n} from './adapters/MEVComplianceKit.js';\n\nexport { GovernmentComplianceKit } from './adapters/GovernmentComplianceKit.js';\nexport type {\n AgencyRole,\n SetupAgencyOptions,\n AgencySetupResult,\n Milestone,\n MilestoneEscrowResult,\n DistributeBenefitsOptions,\n DistributionResult,\n} from './adapters/GovernmentComplianceKit.js';\n\nexport { SocialGraphAdapter } from './adapters/SocialGraphAdapter.js';\nexport type {\n SocialLink,\n TrustNode,\n TrustGraph,\n} from './adapters/SocialGraphAdapter.js';\n\n// ============================================================================\n// Wallet Utilities (re-exported from viem for convenience)\n// ============================================================================\n\nexport { privateKeyToAccount, generatePrivateKey, mnemonicToAccount } from 'viem/accounts';\n"],"mappings":"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","names":["base","baseSepolia","privateKeyToAccount","createPublicClient","http","http","createPublicClient","stringToHex","receipt","stringToHex","formatEther","stringToHex","stringToHex","ZERO_BYTES32","decodeAbiParameters","ZERO_BYTES32","decodeAbiParameters","encodeAbiParameters","base","parseCompactEntryIdFromLogs","decodeEventLog","decodeEventLog","InvarianceIdentityAbi","keccak256","base","formatEther","viemGetContract","viemGetContract","privateKeyToAccount","base","baseSepolia","result","privateKeyToAccount","generatePrivateKey","mnemonicToAccount"]}