@invariance/sdk 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -846,4 +846,4 @@ export {
846
846
  enumToPricingType,
847
847
  parseListingIdFromLogs
848
848
  };
849
- //# sourceMappingURL=chunk-3ONNY6AX.js.map
849
+ //# sourceMappingURL=chunk-2JGPNHE3.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/contract-helpers.ts","../../packages/common/src/types/actions.ts","../../packages/common/src/types/errors.ts","../../packages/common/src/types/templates.ts","../../packages/common/src/types/custom-permissions.ts","../../packages/common/src/constants/chains.ts","../../packages/common/src/constants/contracts.ts","../../packages/common/src/defaults/policy-defaults.ts","../src/errors/InvarianceError.ts"],"sourcesContent":["import type { ActorType, ListingCategory } from '@invariance/common';\nimport type { PricingModel } from '@invariance/common';\nimport type { PublicClient, WalletClient } from 'viem';\nimport { keccak256, toHex, decodeEventLog, stringToHex, hexToString } from 'viem';\nimport { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../errors/InvarianceError.js';\nimport { InvarianceIntentAbi } from '../contracts/abis/index.js';\nimport { InvarianceLedgerAbi } from '../contracts/abis/index.js';\nimport { InvarianceCompactLedgerAbi } from '../contracts/abis/index.js';\nimport { InvarianceAtomicVerifierAbi } from '../contracts/abis/index.js';\nimport { InvarianceReviewAbi } from '../contracts/abis/index.js';\nimport { InvarianceRegistryAbi } from '../contracts/abis/index.js';\n\n/** On-chain ActorType enum values */\nconst ACTOR_TYPE_MAP: Record<ActorType, number> = {\n agent: 0,\n human: 1,\n device: 2,\n service: 3,\n any: 255,\n};\n\nconst REVERSE_ACTOR_TYPE_MAP: Record<number, ActorType> = {\n 0: 'agent',\n 1: 'human',\n 2: 'device',\n 3: 'service',\n};\n\n/** On-chain IdentityStatus enum values */\nconst IDENTITY_STATUS_MAP: Record<number, 'active' | 'suspended' | 'deactivated'> = {\n 0: 'active',\n 1: 'suspended',\n 2: 'deactivated',\n};\n\n/**\n * Map SDK actor type string to on-chain uint8 enum value.\n *\n * @param type - The SDK actor type\n * @returns The on-chain enum value\n */\nexport function actorTypeToEnum(type: ActorType): number {\n const val = ACTOR_TYPE_MAP[type];\n if (val === undefined) {\n throw new InvarianceError(\n ErrorCode.INVALID_ACTOR_TYPE,\n `Unknown actor type: ${type as string}`,\n );\n }\n return val;\n}\n\n/**\n * Map on-chain uint8 enum value to SDK actor type string.\n *\n * @param val - The on-chain enum value\n * @returns The SDK actor type\n */\nexport function enumToActorType(val: number): ActorType {\n const type = REVERSE_ACTOR_TYPE_MAP[val];\n if (!type) {\n throw new InvarianceError(\n ErrorCode.INVALID_ACTOR_TYPE,\n `Unknown on-chain actor type enum: ${val}`,\n );\n }\n return type;\n}\n\n/**\n * Map on-chain IdentityStatus uint8 to SDK status string.\n *\n * @param val - The on-chain status enum value\n * @returns The SDK status string\n */\nexport function identityStatusFromEnum(val: number): 'active' | 'suspended' | 'deactivated' {\n const status = IDENTITY_STATUS_MAP[val];\n if (!status) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown on-chain identity status enum: ${val}`,\n );\n }\n return status;\n}\n\n/**\n * Encode a string ID to bytes32 for on-chain use.\n * If already a 0x-prefixed 66-char hex string, returns as-is.\n * Otherwise, pads the UTF-8 encoded string to 32 bytes.\n *\n * @param id - The string identity ID\n * @returns The bytes32 hex string\n */\nexport function toBytes32(id: string): `0x${string}` {\n // Already a bytes32 hex string\n if (id.startsWith('0x') && id.length === 66) {\n return id as `0x${string}`;\n }\n\n // Handle shorter 0x-prefixed hex strings (e.g., addresses) — pad to 32 bytes\n if (id.startsWith('0x') && /^0x[0-9a-fA-F]+$/.test(id)) {\n const hexPart = id.slice(2);\n if (hexPart.length > 64) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Hex ID exceeds 32 bytes: \"${id}\". Use a shorter identifier or hash it first.`,\n );\n }\n // Left-pad hex values to preserve numeric semantics (0x1 → 0x0100...00, not 0x1000...00)\n return `0x${hexPart.padStart(64, '0')}`;\n }\n\n // Encode string to bytes32 by padding\n const hex = stringToHex(id);\n const hexBody = hex.slice(2);\n if (hexBody.length > 64) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `ID exceeds 32 bytes: \"${id}\" (${hexBody.length / 2} bytes). Use a shorter identifier or hash it first.`,\n );\n }\n return `0x${hexBody.padEnd(64, '0')}`;\n}\n\n/**\n * Decode a bytes32 hex string back to a string representation.\n * Strips trailing zero bytes.\n *\n * @param bytes - The bytes32 hex string\n * @returns The decoded string\n */\nexport function fromBytes32(bytes: `0x${string}`): string {\n const hex = bytes.slice(2);\n // Remove trailing zeros (pairs of 00)\n const trimmed = hex.replace(/(00)+$/, '');\n if (trimmed.length === 0) return '';\n let decoded: string;\n try {\n decoded = hexToString(`0x${trimmed}`);\n } catch {\n console.warn(`[Invariance] fromBytes32: failed to decode hex as UTF-8 string, returning raw hex: ${bytes}`);\n return bytes;\n }\n // If decoded string contains replacement characters or non-printable bytes,\n // it's likely a raw hash — return the original hex to ensure round-trip safety\n const reencoded = stringToHex(decoded).slice(2);\n if (/[\\uFFFD]/.test(decoded) || reencoded.toLowerCase() !== trimmed.toLowerCase()) {\n console.warn(`[Invariance] fromBytes32: round-trip decode mismatch, returning raw hex: ${bytes}`);\n return bytes;\n }\n return decoded;\n}\n\n/** Receipt returned by waitForReceipt */\nexport interface TxReceipt {\n txHash: string;\n blockNumber: number;\n gasUsed: string;\n status: 'success' | 'reverted';\n logs: readonly { topics: readonly string[]; data: string }[];\n}\n\n/** Options for waitForReceipt */\nexport interface WaitForReceiptOptions {\n /** Skip waiting and return an optimistic result with only the txHash */\n optimistic?: boolean;\n /** Transaction confirmation timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Wait for a transaction receipt and verify success.\n *\n * @param publicClient - The viem PublicClient (prefer WS-backed for speed)\n * @param txHash - The transaction hash to wait for\n * @param options - Optional settings (optimistic mode, etc.)\n * @returns The transaction receipt\n * @throws {InvarianceError} If the transaction reverted\n */\nexport async function waitForReceipt(\n publicClient: PublicClient,\n txHash: `0x${string}`,\n options?: WaitForReceiptOptions,\n): Promise<TxReceipt> {\n // Optimistic mode: return immediately with the tx hash, skip receipt wait\n if (options?.optimistic) {\n return {\n txHash,\n blockNumber: 0,\n gasUsed: '0',\n status: 'success',\n logs: [],\n };\n }\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n timeout: options?.timeout ?? 30_000,\n confirmations: 1,\n });\n\n const result: TxReceipt = {\n txHash: receipt.transactionHash,\n blockNumber: Number(receipt.blockNumber),\n gasUsed: receipt.gasUsed.toString(),\n status: receipt.status as 'success' | 'reverted',\n logs: receipt.logs.map((log) => ({\n topics: log.topics as readonly string[],\n data: log.data,\n })),\n };\n\n if (receipt.status === 'reverted') {\n throw new InvarianceError(\n ErrorCode.TX_REVERTED,\n `Transaction reverted: ${txHash}`,\n { txHash },\n );\n }\n\n return result;\n}\n\n/** On-chain PolicyState enum values */\nconst POLICY_STATE_MAP: Record<number, 'active' | 'revoked' | 'expired'> = {\n 0: 'active',\n 1: 'revoked',\n 2: 'expired',\n};\n\n/** On-chain PolicyRuleType enum values */\nconst POLICY_RULE_TYPE_MAP: Record<string, number> = {\n 'max-spend': 0,\n 'max-per-tx': 1,\n 'daily-limit': 2,\n 'action-whitelist': 3,\n 'action-blacklist': 4,\n 'target-whitelist': 5,\n 'target-blacklist': 6,\n 'time-window': 7,\n 'cooldown': 8,\n 'rate-limit': 9,\n 'require-state': 10,\n 'require-balance': 11,\n 'require-approval': 12,\n 'require-attestation': 13,\n // Off-chain only: encoded as Custom on-chain\n 'require-payment': 14,\n 'custom': 14,\n};\n\nconst REVERSE_POLICY_RULE_TYPE_MAP: Record<number, string> = {\n 0: 'max-spend',\n 1: 'max-per-tx',\n 2: 'daily-limit',\n 3: 'action-whitelist',\n 4: 'action-blacklist',\n 5: 'target-whitelist',\n 6: 'target-blacklist',\n 7: 'time-window',\n 8: 'cooldown',\n 9: 'rate-limit',\n 10: 'require-state',\n 11: 'require-balance',\n 12: 'require-approval',\n 13: 'require-attestation',\n 14: 'custom',\n};\n\n/**\n * Map SDK policy rule type string to on-chain uint8 enum value.\n *\n * @param type - The SDK policy rule type\n * @returns The on-chain enum value\n */\nexport function policyRuleTypeToEnum(type: string): number {\n const val = POLICY_RULE_TYPE_MAP[type];\n if (val === undefined) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown policy rule type: ${type}`,\n );\n }\n return val;\n}\n\n/**\n * Map on-chain uint8 enum value to SDK policy rule type string.\n *\n * @param val - The on-chain enum value\n * @returns The SDK policy rule type\n */\nexport function enumToPolicyRuleType(val: number): string {\n const type = REVERSE_POLICY_RULE_TYPE_MAP[val];\n if (!type) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown on-chain policy rule type enum: ${val}`,\n );\n }\n return type;\n}\n\n/**\n * Map on-chain PolicyState uint8 to SDK state string.\n *\n * @param val - The on-chain state enum value\n * @returns The SDK state string\n */\nexport function policyStateFromEnum(val: number): 'active' | 'revoked' | 'expired' {\n const state = POLICY_STATE_MAP[val];\n if (!state) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown on-chain policy state enum: ${val}`,\n );\n }\n return state;\n}\n\n/**\n * Map an array of SDK actor types to on-chain uint8 enum values.\n *\n * @param types - Array of SDK actor types\n * @returns Array of on-chain enum values\n */\nexport function mapActorTypesToEnums(types: ActorType[]): number[] {\n return types.map(actorTypeToEnum);\n}\n\n/** On-chain EscrowState enum values */\nconst ESCROW_STATE_MAP: Record<number, 'created' | 'funded' | 'active' | 'released' | 'refunded' | 'disputed' | 'resolved'> = {\n 0: 'created',\n 1: 'funded',\n 2: 'active',\n 3: 'released',\n 4: 'refunded',\n 5: 'disputed',\n 6: 'resolved',\n};\n\n/** On-chain EscrowConditionType enum values */\nconst ESCROW_CONDITION_TYPE_MAP: Record<string, number> = {\n 'task-completion': 0,\n 'multi-sig': 1,\n 'intent-verified': 2,\n 'milestone': 3,\n};\n\nconst REVERSE_ESCROW_CONDITION_TYPE_MAP: Record<number, 'task-completion' | 'multi-sig' | 'intent-verified' | 'milestone'> = {\n 0: 'task-completion',\n 1: 'multi-sig',\n 2: 'intent-verified',\n 3: 'milestone',\n};\n\n/**\n * Map SDK escrow condition type string to on-chain uint8 enum value.\n *\n * @param type - The SDK escrow condition type\n * @returns The on-chain enum value\n */\nexport function escrowConditionTypeToEnum(type: 'task-completion' | 'multi-sig' | 'intent-verified' | 'milestone'): number {\n const val = ESCROW_CONDITION_TYPE_MAP[type];\n if (val === undefined) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown escrow condition type: ${type}`,\n );\n }\n return val;\n}\n\n/**\n * Map on-chain uint8 enum value to SDK escrow condition type string.\n *\n * @param val - The on-chain enum value\n * @returns The SDK escrow condition type\n */\nexport function enumToEscrowConditionType(val: number): 'task-completion' | 'multi-sig' | 'intent-verified' | 'milestone' {\n const type = REVERSE_ESCROW_CONDITION_TYPE_MAP[val];\n if (!type) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown on-chain escrow condition type enum: ${val}`,\n );\n }\n return type;\n}\n\n/**\n * Map on-chain EscrowState uint8 to SDK state string.\n *\n * @param val - The on-chain state enum value\n * @returns The SDK state string\n */\nexport function escrowStateFromEnum(val: number): 'created' | 'funded' | 'active' | 'released' | 'refunded' | 'disputed' | 'resolved' {\n const state = ESCROW_STATE_MAP[val];\n if (state === undefined) {\n throw new InvarianceError(\n ErrorCode.ESCROW_NOT_FOUND,\n `Unknown on-chain escrow state enum: ${val}`,\n );\n }\n return state;\n}\n\n/** Known contract error names mapped to SDK error codes */\nconst CONTRACT_ERROR_MAP: Record<string, ErrorCode> = {\n IdentityNotFound: ErrorCode.IDENTITY_NOT_FOUND,\n NotIdentityOwner: ErrorCode.NOT_AUTHORIZED_SIGNER,\n AddressAlreadyRegistered: ErrorCode.INVALID_INPUT,\n IdentityNotActive: ErrorCode.IDENTITY_SUSPENDED,\n IdentityAlreadyDeactivated: ErrorCode.IDENTITY_SUSPENDED,\n IdentityNotSuspended: ErrorCode.IDENTITY_NOT_FOUND,\n InvalidAddress: ErrorCode.INVALID_INPUT,\n AttestationNotFound: ErrorCode.IDENTITY_NOT_FOUND,\n AttestationAlreadyRevoked: ErrorCode.IDENTITY_NOT_FOUND,\n NotAttester: ErrorCode.NOT_AUTHORIZED_SIGNER,\n AccessControlUnauthorizedAccount: ErrorCode.NOT_AUTHORIZED_SIGNER,\n // Escrow-specific errors\n EscrowNotFound: ErrorCode.ESCROW_NOT_FOUND,\n InvalidAmount: ErrorCode.INVALID_INPUT,\n InvalidBeneficiary: ErrorCode.INVALID_INPUT,\n NotDepositor: ErrorCode.NOT_AUTHORIZED_SIGNER,\n NotBeneficiary: ErrorCode.NOT_AUTHORIZED_SIGNER,\n NotParty: ErrorCode.NOT_AUTHORIZED_SIGNER,\n InvalidState: ErrorCode.ESCROW_WRONG_STATE,\n AlreadyFunded: ErrorCode.ESCROW_WRONG_STATE,\n NotFunded: ErrorCode.ESCROW_WRONG_STATE,\n AlreadyApproved: ErrorCode.ESCROW_WRONG_STATE,\n NotSigner: ErrorCode.NOT_AUTHORIZED_SIGNER,\n ThresholdNotMet: ErrorCode.ESCROW_WRONG_STATE,\n EscrowExpired: ErrorCode.ESCROW_WRONG_STATE,\n DisputeAlreadyExists: ErrorCode.ESCROW_WRONG_STATE,\n DisputeNotFound: ErrorCode.ESCROW_NOT_FOUND,\n DisputeAlreadyResolved: ErrorCode.ESCROW_WRONG_STATE,\n // Policy-specific errors\n PolicyNotFound: ErrorCode.POLICY_VIOLATION,\n PolicyNotActive: ErrorCode.POLICY_VIOLATION,\n PolicyAlreadyAttached: ErrorCode.POLICY_VIOLATION,\n PolicyNotAttached: ErrorCode.POLICY_VIOLATION,\n NotPolicyCreator: ErrorCode.NOT_AUTHORIZED_SIGNER,\n NoRulesProvided: ErrorCode.POLICY_VIOLATION,\n InvalidExpiresAt: ErrorCode.POLICY_VIOLATION,\n // Intent-specific errors\n IntentNotFound: ErrorCode.INVALID_INPUT,\n IntentNotPending: ErrorCode.INTENT_REJECTED,\n IntentNotApproved: ErrorCode.INTENT_REJECTED,\n IntentNotExecuting: ErrorCode.INTENT_REJECTED,\n IntentExpiredError: ErrorCode.INTENT_EXPIRED,\n NotRequester: ErrorCode.NOT_AUTHORIZED_SIGNER,\n PolicyDenied: ErrorCode.POLICY_VIOLATION,\n InvalidExpiration: ErrorCode.INVALID_INPUT,\n // Registry-specific errors\n ListingNotFound: ErrorCode.INVALID_INPUT,\n NotListingOwner: ErrorCode.NOT_AUTHORIZED_SIGNER,\n ListingAlreadyInactive: ErrorCode.INVALID_INPUT,\n EmptyName: ErrorCode.INVALID_INPUT,\n // Review-specific errors\n ReviewNotFound: ErrorCode.INVALID_INPUT,\n EscrowNotCompleted: ErrorCode.ESCROW_WRONG_STATE,\n NotEscrowParty: ErrorCode.NOT_AUTHORIZED_SIGNER,\n AlreadyReviewed: ErrorCode.ALREADY_REVIEWED,\n};\n\n/**\n * Map a viem contract revert error to a typed InvarianceError.\n *\n * @param error - The caught error (typically a viem ContractFunctionRevertedError)\n * @returns An InvarianceError with the appropriate error code\n */\nexport function mapContractError(error: unknown): InvarianceError {\n if (error instanceof InvarianceError) {\n return error;\n }\n\n // Handle viem ContractFunctionRevertedError\n if (\n error !== null &&\n typeof error === 'object' &&\n 'name' in error &&\n (error as { name: string }).name === 'ContractFunctionRevertedError'\n ) {\n const revertError = error as {\n name: string;\n data?: { errorName?: string };\n message: string;\n };\n const errorName = revertError.data?.errorName;\n if (errorName && errorName in CONTRACT_ERROR_MAP) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const mapped = new InvarianceError(CONTRACT_ERROR_MAP[errorName]!, errorName);\n mapped.cause = error;\n return mapped;\n }\n const mapped = new InvarianceError(ErrorCode.TX_REVERTED, revertError.message);\n mapped.cause = error;\n return mapped;\n }\n\n // Generic error fallback\n const message = error instanceof Error ? error.message : 'Unknown contract error';\n const mapped = new InvarianceError(ErrorCode.NETWORK_ERROR, message);\n mapped.cause = error;\n return mapped;\n}\n\n/*//////////////////////////////////////////////////////////////\n INTENT PROTOCOL HELPERS\n//////////////////////////////////////////////////////////////*/\n\n/** On-chain IntentStatus enum values */\nconst INTENT_STATUS_MAP: Record<number, 'pending' | 'approved' | 'executing' | 'completed' | 'rejected' | 'expired'> = {\n 0: 'pending',\n 1: 'approved',\n 2: 'executing',\n 3: 'completed',\n 4: 'rejected',\n 5: 'expired',\n};\n\n/**\n * Map on-chain IntentStatus uint8 to SDK lifecycle string.\n *\n * @param val - The on-chain status enum value\n * @returns The SDK lifecycle string\n */\nexport function intentStatusFromEnum(val: number): 'pending' | 'approved' | 'executing' | 'completed' | 'rejected' | 'expired' {\n const status = INTENT_STATUS_MAP[val];\n if (!status) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown on-chain intent status enum: ${val}`,\n );\n }\n return status;\n}\n\n/**\n * Parse intentId from transaction logs.\n * Looks for the IntentRequested event and extracts the intentId.\n *\n * @param logs - Transaction receipt logs\n * @returns The intent ID as bytes32 hex string\n */\nexport function parseIntentIdFromLogs(logs: readonly { topics: readonly string[]; data: string }[]): `0x${string}` {\n for (const log of logs) {\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 return (decoded.args as { intentId: `0x${string}` }).intentId;\n }\n } catch {\n continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.TX_REVERTED,\n 'IntentRequested event not found in transaction logs',\n );\n}\n\n/**\n * Hash metadata object to bytes32 for on-chain storage.\n * Uses keccak256 of JSON-stringified metadata.\n *\n * @param metadata - The metadata object to hash\n * @returns The keccak256 hash as bytes32 hex string\n */\nexport function hashMetadata(metadata: Record<string, unknown>): `0x${string}` {\n const json = JSON.stringify(metadata);\n return keccak256(toHex(json));\n}\n\n/*//////////////////////////////////////////////////////////////\n EVENT LEDGER HELPERS\n//////////////////////////////////////////////////////////////*/\n\n/** On-chain Severity enum values */\nconst SEVERITY_MAP: Record<'info' | 'warn' | 'error', number> = {\n info: 0,\n warn: 1,\n error: 2,\n};\n\n/**\n * Map SDK severity string to on-chain uint8 enum value.\n *\n * @param severity - The SDK severity level\n * @returns The on-chain enum value\n */\nexport function mapSeverity(severity: 'info' | 'warn' | 'error'): number {\n return SEVERITY_MAP[severity];\n}\n\n/**\n * Parse entryId from transaction logs.\n * Looks for the EntryLogged event and extracts the entryId.\n *\n * @param logs - Transaction receipt logs\n * @returns The entry ID as bytes32 hex string\n */\nexport function parseEntryIdFromLogs(logs: readonly { topics: readonly string[]; data: string }[]): `0x${string}` {\n for (const log of logs) {\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 return (decoded.args as { entryId: `0x${string}` }).entryId;\n }\n } catch {\n continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.TX_REVERTED,\n 'EntryLogged event not found in transaction logs',\n );\n}\n\n/** EIP-712 domain for CompactLedger signatures */\nexport interface CompactLedgerDomain {\n name: string;\n version: string;\n chainId: number;\n verifyingContract: `0x${string}`;\n}\n\n/** EIP-712 type definition for CompactLedger LogEntry */\nconst COMPACT_LEDGER_TYPES = {\n LogEntry: [\n { name: 'actorIdentityId', type: 'bytes32' },\n { name: 'actorAddress', type: 'address' },\n { name: 'action', type: 'string' },\n { name: 'category', type: 'string' },\n { name: 'metadataHash', type: 'bytes32' },\n { name: 'proofHash', type: 'bytes32' },\n { name: 'severity', type: 'uint8' },\n ],\n} as const;\n\n/**\n * Generate an EIP-712 typed-data actor signature for the CompactLedger.\n *\n * The CompactLedger contract verifies this signature on-chain via ECDSA.recover,\n * so a real wallet signature is required (no keccak fallback).\n *\n * @param input - The compact log input struct fields\n * @param domain - EIP-712 domain parameters\n * @param walletClient - The actor's viem WalletClient (must have an account)\n * @returns The EIP-712 signature as a hex string\n */\nexport async function generateActorSignatureEIP712(\n input: {\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 domain: CompactLedgerDomain,\n walletClient: WalletClient,\n): Promise<`0x${string}`> {\n const account = walletClient.account;\n if (!account) {\n throw new InvarianceError(\n ErrorCode.WALLET_NOT_CONNECTED,\n 'EIP-712 signing requires a connected wallet account. No keccak fallback is available for CompactLedger.',\n );\n }\n return walletClient.signTypedData({\n account,\n domain,\n types: COMPACT_LEDGER_TYPES,\n primaryType: 'LogEntry',\n message: {\n actorIdentityId: input.actorIdentityId,\n actorAddress: input.actorAddress as `0x${string}`,\n action: input.action,\n category: input.category,\n metadataHash: input.metadataHash,\n proofHash: input.proofHash,\n severity: input.severity,\n },\n });\n}\n\n/**\n * Generate an EIP-712 platform attestation via the backend API.\n *\n * CompactLedger requires a real ECDSA signature from the platform signer.\n * The keccak256 fallback will fail on-chain, so an API key is mandatory.\n *\n * @param input - The compact log input struct fields\n * @param apiKey - API key for authenticated attestation (required)\n * @param apiBaseUrl - Optional API base URL override\n * @returns The platform's EIP-712 ECDSA signature\n * @throws {InvarianceError} If no API key is provided\n */\nexport async function generatePlatformAttestationEIP712(\n input: {\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 apiKey: string | undefined,\n apiBaseUrl?: string,\n): Promise<`0x${string}`> {\n if (!apiKey) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n 'CompactLedger requires an API key for platform attestation. The keccak256 fallback is not a valid ECDSA signature and will revert on-chain. Set apiKey in your Invariance config.',\n );\n }\n\n const envUrl = typeof process !== 'undefined' ? process.env['INVARIANCE_API_URL'] : undefined;\n const baseUrl = apiBaseUrl ?? envUrl ?? 'https://api.useinvariance.com';\n\n const response = await fetch(`${baseUrl}/v1/attest`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n mode: 'eip712',\n input: {\n actorIdentityId: input.actorIdentityId,\n actorAddress: input.actorAddress,\n action: input.action,\n category: input.category,\n metadataHash: input.metadataHash,\n proofHash: input.proofHash,\n severity: input.severity,\n },\n }),\n });\n\n if (!response.ok) {\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Platform attestation API returned ${response.status}. CompactLedger requires a valid platform signature.`,\n );\n }\n\n const result = await response.json() as { data: { signature: string } };\n return result.data.signature as `0x${string}`;\n}\n\n/**\n * Parse entryId from CompactLedger transaction logs.\n * Looks for the EntryLogged event from the CompactLedger ABI.\n *\n * @param logs - Transaction receipt logs\n * @returns The entry ID as bytes32 hex string\n */\nexport function parseCompactEntryIdFromLogs(logs: readonly { topics: readonly string[]; data: string }[]): `0x${string}` {\n for (const log of logs) {\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 return (decoded.args as { entryId: `0x${string}` }).entryId;\n }\n } catch {\n continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.TX_REVERTED,\n 'CompactLedger EntryLogged event not found in transaction logs',\n );\n}\n\n/**\n * Parse entryId from AtomicVerifier transaction logs.\n * Looks for the AtomicVerification event.\n *\n * @param logs - Transaction receipt logs\n * @returns The entry ID as bytes32 hex string\n */\nexport function parseAtomicEntryIdFromLogs(logs: readonly { topics: readonly string[]; data: string }[]): `0x${string}` {\n for (const log of logs) {\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 return (decoded.args as { entryId: `0x${string}` }).entryId;\n }\n } catch {\n continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.TX_REVERTED,\n 'AtomicVerification event not found in transaction logs',\n );\n}\n\n/**\n * Generate actor signature for ledger entry.\n * Signs the event payload with the actor's wallet.\n *\n * @param event - The ledger event being signed\n * @param walletClient - The actor's viem WalletClient\n * @returns The actor's signature\n */\nexport async function generateActorSignature(\n event: { action: string; metadata?: Record<string, unknown> },\n walletClient: WalletClient,\n): Promise<string> {\n const message = JSON.stringify({ action: event.action, metadata: event.metadata ?? {} });\n const account = walletClient.account;\n if (!account) {\n // Fallback: deterministic commitment hash when no account is available\n return keccak256(toHex(message));\n }\n return walletClient.signMessage({ account, message });\n}\n\n/**\n * Generate platform co-signature for ledger entry.\n * Produces a keccak256 commitment hash of the event.\n *\n * @security WARNING: This is NOT a cryptographic signature. It is a deterministic\n * keccak256 hash with no private key involved. Anyone who knows the event data\n * can reproduce this hash. In production, replace with server-side ECDSA signing\n * using the platform's private key to provide authentic platform attestation.\n *\n * @param event - The ledger event being co-signed\n * @returns The platform's commitment hash (NOT a real signature)\n */\nexport function generatePlatformCommitment(event: { action: string; metadata?: Record<string, unknown> }): string {\n const payload = JSON.stringify({ action: event.action, metadata: event.metadata ?? {}, platform: 'Invariance' });\n return keccak256(toHex(payload));\n}\n\n/**\n * Generate a real ECDSA platform attestation via the backend API.\n *\n * When an API key is provided, calls POST /v1/attest to obtain a server-signed\n * attestation. Without an API key, falls back to the unsigned keccak256 commitment.\n *\n * @param event - The ledger event being attested\n * @param apiKey - Optional API key for authenticated attestation\n * @param apiBaseUrl - Optional API base URL override\n * @returns The platform signature (ECDSA if API key provided, keccak256 hash otherwise)\n */\nexport async function generatePlatformAttestation(\n event: { action: string; metadata?: Record<string, unknown> },\n apiKey?: string,\n apiBaseUrl?: string,\n): Promise<string> {\n if (!apiKey) {\n return generatePlatformCommitment(event);\n }\n\n const envUrl = typeof process !== 'undefined' ? process.env['INVARIANCE_API_URL'] : undefined;\n const baseUrl = apiBaseUrl ?? envUrl ?? 'https://api.useinvariance.com';\n\n try {\n const response = await fetch(`${baseUrl}/v1/attest`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n action: event.action,\n metadata: event.metadata ?? {},\n }),\n });\n\n if (!response.ok) {\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Attestation API returned ${response.status}. Cannot generate platform signature.`,\n );\n }\n\n const result = await response.json() as Record<string, unknown>;\n const data = result['data'] as Record<string, unknown> | undefined;\n if (!data || typeof data['signature'] !== 'string') {\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n 'Attestation API returned invalid response shape. Expected { data: { signature: string } }.',\n );\n }\n return data['signature'] as string;\n } catch (err) {\n if (err instanceof InvarianceError) throw err;\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Attestation API unreachable: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Convert array of ledger entries to CSV format.\n *\n * @param entries - Array of ledger entries\n * @returns CSV-formatted string\n */\nexport function convertToCSV(entries: Array<{ entryId: string; action: string; timestamp: number; txHash: string }>): string {\n if (entries.length === 0) return 'entryId,action,timestamp,txHash\\n';\n\n const sanitize = (v: string): string => {\n const first = v.charAt(0);\n if (first === '=' || first === '+' || first === '-' || first === '@') {\n return `'${v}`;\n }\n return v.includes(',') || v.includes('\"') ? `\"${v.replace(/\"/g, '\"\"')}\"` : v;\n };\n const headers = 'entryId,action,timestamp,txHash\\n';\n const rows = entries.map((e) => `${sanitize(e.entryId)},${sanitize(e.action)},${e.timestamp},${sanitize(e.txHash)}`).join('\\n');\n return headers + rows;\n}\n\n/*//////////////////////////////////////////////////////////////\n REPUTATION ENGINE HELPERS\n//////////////////////////////////////////////////////////////*/\n\n/**\n * Parse reviewId from transaction logs.\n * Looks for the ReviewSubmitted event and extracts the reviewId.\n *\n * @param logs - Transaction receipt logs\n * @returns The review ID as bytes32 hex string\n */\nexport function parseReviewIdFromLogs(logs: readonly { topics: readonly string[]; data: string }[]): `0x${string}` {\n for (const log of logs) {\n try {\n const decoded = decodeEventLog({\n abi: InvarianceReviewAbi,\n data: log.data as `0x${string}`,\n topics: log.topics as [`0x${string}`, ...`0x${string}`[]],\n });\n if (decoded.eventName === 'ReviewSubmitted') {\n return (decoded.args as { reviewId: `0x${string}` }).reviewId;\n }\n } catch {\n continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.TX_REVERTED,\n 'ReviewSubmitted event not found in transaction logs',\n );\n}\n\n/*//////////////////////////////////////////////////////////////\n MARKETPLACE REGISTRY HELPERS\n//////////////////////////////////////////////////////////////*/\n\n/** On-chain ListingCategory enum values */\nconst LISTING_CATEGORY_MAP: Record<ListingCategory, number> = {\n trading: 0,\n content: 1,\n analysis: 2,\n automation: 3,\n research: 4,\n creative: 5,\n development: 6,\n custom: 7,\n};\n\nconst REVERSE_LISTING_CATEGORY_MAP: Record<number, ListingCategory> = {\n 0: 'trading',\n 1: 'content',\n 2: 'analysis',\n 3: 'automation',\n 4: 'research',\n 5: 'creative',\n 6: 'development',\n 7: 'custom',\n};\n\n/** On-chain PricingType enum values */\nconst PRICING_TYPE_MAP: Record<PricingModel['type'], number> = {\n fixed: 0,\n hourly: 1,\n 'per-task': 2,\n subscription: 3,\n};\n\nconst REVERSE_PRICING_TYPE_MAP: Record<number, PricingModel['type']> = {\n 0: 'fixed',\n 1: 'hourly',\n 2: 'per-task',\n 3: 'subscription',\n};\n\n/**\n * Map SDK listing category string to on-chain uint8 enum value.\n *\n * @param category - The SDK listing category\n * @returns The on-chain enum value\n */\nexport function listingCategoryToEnum(category: ListingCategory): number {\n const val = LISTING_CATEGORY_MAP[category];\n if (val === undefined) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown listing category: ${category}`,\n );\n }\n return val;\n}\n\n/**\n * Map on-chain uint8 enum value to SDK listing category string.\n *\n * @param val - The on-chain enum value\n * @returns The SDK listing category\n */\nexport function enumToListingCategory(val: number): ListingCategory {\n const category = REVERSE_LISTING_CATEGORY_MAP[val];\n if (!category) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown on-chain listing category enum: ${val}`,\n );\n }\n return category;\n}\n\n/**\n * Map SDK pricing type string to on-chain uint8 enum value.\n *\n * @param type - The SDK pricing type\n * @returns The on-chain enum value\n */\nexport function pricingTypeToEnum(type: PricingModel['type']): number {\n const val = PRICING_TYPE_MAP[type];\n if (val === undefined) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown pricing type: ${type}`,\n );\n }\n return val;\n}\n\n/**\n * Map on-chain uint8 enum value to SDK pricing type string.\n *\n * @param val - The on-chain enum value\n * @returns The SDK pricing type\n */\nexport function enumToPricingType(val: number): PricingModel['type'] {\n const type = REVERSE_PRICING_TYPE_MAP[val];\n if (!type) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown on-chain pricing type enum: ${val}`,\n );\n }\n return type;\n}\n\n/**\n * Parse listingId from transaction logs.\n * Looks for the ListingRegistered event and extracts the listingId.\n *\n * @param logs - Transaction receipt logs\n * @returns The listing ID as bytes32 hex string\n */\nexport function parseListingIdFromLogs(logs: readonly { topics: readonly string[]; data: string }[]): `0x${string}` {\n for (const log of logs) {\n try {\n const decoded = decodeEventLog({\n abi: InvarianceRegistryAbi,\n data: log.data as `0x${string}`,\n topics: log.topics as [`0x${string}`, ...`0x${string}`[]],\n });\n if (decoded.eventName === 'ListingRegistered') {\n return (decoded.args as { listingId: `0x${string}` }).listingId;\n }\n } catch {\n continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.TX_REVERTED,\n 'ListingRegistered event not found in transaction logs',\n );\n}\n","import type { ActionCategory } from './policies.js';\n\n/**\n * Actor types supported by the Invariance Protocol.\n */\nexport type ActorType = 'agent' | 'human' | 'device' | 'service' | 'any';\n\n/**\n * Branded type for agent identifiers.\n */\ndeclare const AgentIdBrand: unique symbol;\nexport type AgentId = string & { readonly [AgentIdBrand]: typeof AgentIdBrand };\n\n/**\n * Branded type for action identifiers.\n */\ndeclare const ActionIdBrand: unique symbol;\nexport type ActionId = string & { readonly [ActionIdBrand]: typeof ActionIdBrand };\n\n/**\n * Branded type for task identifiers.\n */\ndeclare const TaskIdBrand: unique symbol;\nexport type TaskId = string & { readonly [TaskIdBrand]: typeof TaskIdBrand };\n\n/**\n * Branded type for intent hash identifiers.\n * Intent hash = hash(action + params + policyHash)\n */\ndeclare const IntentHashBrand: unique symbol;\nexport type IntentHash = string & { readonly [IntentHashBrand]: typeof IntentHashBrand };\n\n/**\n * Represents an action that an agent wants to execute.\n */\nexport interface Action {\n /** Unique action identifier */\n id: ActionId;\n /** The type of action being performed */\n type: string;\n /** Action-specific parameters */\n params: Record<string, unknown>;\n /** Unix timestamp when the action was created */\n timestamp: number;\n}\n\n/**\n * Input for creating a new action.\n */\nexport interface ActionInput {\n /** The type of action being performed */\n type: string;\n /** Action-specific parameters */\n params: Record<string, unknown>;\n}\n\n/**\n * Result of an action execution.\n */\nexport interface ActionResult {\n /** Whether the action was successful */\n success: boolean;\n /** The action that was executed */\n action: Action;\n /** Transaction hash on-chain */\n txHash: string;\n /** Block number where the action was logged */\n blockNumber: number;\n /** Any error message if the action failed */\n error?: string;\n}\n\n/**\n * Extended action result with provenance tracking.\n * Includes intent hash, policy version, and optional runtime fingerprint.\n */\nexport interface ActionResultWithProvenance extends ActionResult {\n /** Intent hash: hash(action + params + policyHash) */\n intentHash: IntentHash;\n /** Hash of policy config used for this action */\n policyHash: string;\n /** Policy version at execution time */\n policyVersion: string;\n /** Action category */\n category: ActionCategory;\n /** Value moved in this action (in wei) */\n valueMoved: bigint;\n /** Gas used for execution */\n gasUsed: bigint;\n /** Optional: hash(SDK version + agent code hash) */\n runtimeFingerprint?: string;\n}\n\n/**\n * Create an AgentId from a string (unsafe, no validation).\n */\nexport function createAgentId(id: string): AgentId {\n return id as AgentId;\n}\n\n/**\n * Create an ActionId from a string (unsafe, no validation).\n */\nexport function createActionId(id: string): ActionId {\n return id as ActionId;\n}\n\n/**\n * Create a TaskId from a string (unsafe, no validation).\n */\nexport function createTaskId(id: string): TaskId {\n return id as TaskId;\n}\n\n/**\n * Create an IntentHash from a string (unsafe, no validation).\n */\nexport function createIntentHash(hash: string): IntentHash {\n return hash as IntentHash;\n}\n","/** Error codes for all Invariance SDK operations */\nexport enum ErrorCode {\n IDENTITY_NOT_FOUND = 'IDENTITY_NOT_FOUND',\n IDENTITY_SUSPENDED = 'IDENTITY_SUSPENDED',\n INVALID_ACTOR_TYPE = 'INVALID_ACTOR_TYPE',\n WALLET_NOT_CONNECTED = 'WALLET_NOT_CONNECTED',\n INSUFFICIENT_BALANCE = 'INSUFFICIENT_BALANCE',\n INTENT_REJECTED = 'INTENT_REJECTED',\n INTENT_EXPIRED = 'INTENT_EXPIRED',\n APPROVAL_TIMEOUT = 'APPROVAL_TIMEOUT',\n POLICY_VIOLATION = 'POLICY_VIOLATION',\n BUDGET_EXCEEDED = 'BUDGET_EXCEEDED',\n ACTION_NOT_ALLOWED = 'ACTION_NOT_ALLOWED',\n TARGET_BLOCKED = 'TARGET_BLOCKED',\n COOLDOWN_ACTIVE = 'COOLDOWN_ACTIVE',\n RATE_LIMITED = 'RATE_LIMITED',\n STATE_GATE_FAILED = 'STATE_GATE_FAILED',\n ATTESTATION_REQUIRED = 'ATTESTATION_REQUIRED',\n ESCROW_NOT_FOUND = 'ESCROW_NOT_FOUND',\n ESCROW_WRONG_STATE = 'ESCROW_WRONG_STATE',\n NOT_AUTHORIZED_SIGNER = 'NOT_AUTHORIZED_SIGNER',\n NO_ESCROW_FOR_REVIEW = 'NO_ESCROW_FOR_REVIEW',\n ALREADY_REVIEWED = 'ALREADY_REVIEWED',\n NETWORK_ERROR = 'NETWORK_ERROR',\n TX_REVERTED = 'TX_REVERTED',\n VERIFICATION_FAILED = 'VERIFICATION_FAILED',\n PAYMENT_REQUIRED = 'PAYMENT_REQUIRED',\n PAYMENT_FAILED = 'PAYMENT_FAILED',\n PAYMENT_VERIFICATION_FAILED = 'PAYMENT_VERIFICATION_FAILED',\n ERC8004_NOT_DEPLOYED = 'ERC8004_NOT_DEPLOYED',\n ERC8004_AGENT_NOT_FOUND = 'ERC8004_AGENT_NOT_FOUND',\n NOT_IMPLEMENTED = 'NOT_IMPLEMENTED',\n INVALID_INPUT = 'INVALID_INPUT',\n}\n","/**\n * Template system core types for Invariance Protocol.\n * Templates compose verification rules declaratively for smart contract gating.\n */\n\n// ============================================================================\n// Branded Types\n// ============================================================================\n\ndeclare const TemplateIdBrand: unique symbol;\n/**\n * Branded type for template identifiers.\n */\nexport type TemplateId = string & { readonly [TemplateIdBrand]: typeof TemplateIdBrand };\n\n/**\n * Create a TemplateId from a string (unsafe, no validation).\n */\nexport function createTemplateId(id: string): TemplateId {\n return id as TemplateId;\n}\n\n// ============================================================================\n// Function Definition\n// ============================================================================\n\n/**\n * Defines a function that can be called through the template.\n */\nexport interface FunctionDefinition {\n /** Function selector or name */\n selector: string;\n /** Human-readable function name */\n name: string;\n /** Function signature (e.g., \"transfer(address,uint256)\") */\n signature: string;\n /** Parameter definitions */\n parameters: ParameterDefinition[];\n}\n\n/**\n * Defines a parameter for a function.\n */\nexport interface ParameterDefinition {\n /** Parameter name */\n name: string;\n /** Solidity type (e.g., \"address\", \"uint256\", \"bytes\") */\n type: string;\n /** Whether this parameter is indexed in events */\n indexed?: boolean;\n /** Human-readable description */\n description?: string;\n}\n\n// ============================================================================\n// Verification Rules\n// ============================================================================\n\nimport type { AuthorizationRule } from './authorization.js';\nimport type { ProofRequirement } from './proof-requirements.js';\nimport type { StateCondition } from './conditions.js';\nimport type { TimingRule } from './timing.js';\nimport type { StakingRule } from './staking.js';\nimport type { RateLimitRule } from './rate-limiting.js';\n\n/**\n * Complete set of verification rules for a template.\n */\nexport interface VerificationRules {\n /** Authorization requirements (who can execute) */\n authorization?: AuthorizationRule[];\n /** Proof requirements (what evidence is needed) */\n proofs?: ProofRequirement[];\n /** State conditions (what must be true on-chain) */\n conditions?: StateCondition[];\n /** Timing rules (when execution is allowed) */\n timing?: TimingRule[];\n /** Staking requirements (what must be locked) */\n staking?: StakingRule[];\n /** Rate limiting rules (how often execution is allowed) */\n rateLimits?: RateLimitRule[];\n}\n\n// ============================================================================\n// Execution Configuration\n// ============================================================================\n\nimport type { ExecutionMode, RollbackRule } from './execution.js';\n\n/**\n * Configuration for how actions are executed.\n */\nexport interface ExecutionConfig {\n /** How the action should be executed */\n mode: ExecutionMode;\n /** Rules for rolling back failed executions */\n rollback?: RollbackRule;\n /** Gas limit for execution */\n gasLimit?: bigint;\n /** Priority fee in wei */\n maxPriorityFee?: bigint;\n /** Maximum fee per gas in wei */\n maxFeePerGas?: bigint;\n /** Number of block confirmations required */\n confirmations?: number;\n}\n\n// ============================================================================\n// Monitoring Configuration\n// ============================================================================\n\nimport type { LoggingLevel, ComplianceConfig, TemplateEvent } from './monitoring.js';\n\n/**\n * Configuration for monitoring and logging.\n */\nexport interface MonitoringConfig {\n /** Logging verbosity level */\n loggingLevel: LoggingLevel;\n /** Events to emit during execution */\n events?: TemplateEvent[];\n /** Compliance and audit configuration */\n compliance?: ComplianceConfig;\n /** Whether to store execution proofs on-chain */\n storeProofs?: boolean;\n /** Webhook URL for real-time notifications */\n webhookUrl?: string;\n}\n\n// ============================================================================\n// Template Options\n// ============================================================================\n\n/**\n * Options for creating a template.\n */\nexport interface TemplateOptions {\n /** Unique template identifier */\n templateId: TemplateId;\n /** Human-readable template name */\n name: string;\n /** Template description */\n description?: string;\n /** Template version (semver) */\n version: string;\n /** Whether the template is currently active */\n active: boolean;\n /** Template author/owner address */\n owner?: string;\n /** Tags for categorization */\n tags?: string[];\n}\n\n// ============================================================================\n// Main Template Interface\n// ============================================================================\n\n/**\n * Complete template definition for Invariance Protocol.\n * Templates compose verification rules declaratively.\n */\nexport interface InvarianceTemplate {\n /** Template metadata and options */\n options: TemplateOptions;\n /** Functions this template applies to */\n functions: FunctionDefinition[];\n /** Verification rules to enforce */\n verification: VerificationRules;\n /** Execution configuration */\n execution: ExecutionConfig;\n /** Monitoring and logging configuration */\n monitoring?: MonitoringConfig;\n}\n\n// ============================================================================\n// Template Check Result\n// ============================================================================\n\n/**\n * Detailed result of a template verification check.\n */\nexport interface TemplateCheckResult {\n /** Whether the action is allowed */\n allowed: boolean;\n /** Template that performed the check */\n templateId: TemplateId;\n /** Timestamp of the check */\n timestamp: number;\n /** Results from each verification rule category */\n ruleResults: RuleCheckResults;\n /** Human-readable reason for denial (if not allowed) */\n reason?: string;\n /** Detailed errors from failed checks */\n errors?: TemplateError[];\n /** Warnings that don't block execution */\n warnings?: string[];\n /** Metadata about the check */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Results from each category of verification rules.\n */\nexport interface RuleCheckResults {\n authorization?: RuleResult;\n proofs?: RuleResult;\n conditions?: RuleResult;\n timing?: RuleResult;\n staking?: RuleResult;\n rateLimits?: RuleResult;\n}\n\n/**\n * Result of checking a single rule category.\n */\nexport interface RuleResult {\n /** Whether all rules in this category passed */\n passed: boolean;\n /** Number of rules checked */\n rulesChecked: number;\n /** Number of rules that passed */\n rulesPassed: number;\n /** Details about individual rule checks */\n details?: RuleDetail[];\n}\n\n/**\n * Detail about a single rule check.\n */\nexport interface RuleDetail {\n /** Rule type identifier */\n ruleType: string;\n /** Whether this rule passed */\n passed: boolean;\n /** Human-readable message */\n message?: string;\n /** Additional data about the check */\n data?: Record<string, unknown>;\n}\n\n/**\n * Error from a failed template check.\n */\nexport interface TemplateError {\n /** Error code */\n code: string;\n /** Human-readable error message */\n message: string;\n /** Rule that caused the error */\n rule?: string;\n /** Additional error context */\n context?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Verification Context\n// ============================================================================\n\n/**\n * Context provided to template verification.\n */\nexport interface VerificationContext {\n /** Address initiating the action */\n sender: string;\n /** Current block number */\n blockNumber: number;\n /** Current block timestamp */\n timestamp: number;\n /** Chain ID */\n chainId?: number;\n /** Transaction value in wei */\n value?: bigint;\n /** Gas price in wei */\n gasPrice?: bigint;\n /** Nonce for the transaction */\n nonce?: number;\n /** Additional context data */\n data?: Record<string, unknown>;\n}\n","/**\n * Custom Permission Marketplace Types\n *\n * Types for the custom permission marketplace, enabling users to write,\n * deploy, and share custom Solidity verification logic.\n */\n\n// ============================================================================\n// Branded Types\n// ============================================================================\n\ndeclare const CustomPermissionIdBrand: unique symbol;\n\n/**\n * Branded type for custom permission IDs.\n * Used to identify permissions in the marketplace registry.\n */\nexport type CustomPermissionId = string & {\n readonly [CustomPermissionIdBrand]: typeof CustomPermissionIdBrand;\n};\n\n/**\n * Create a CustomPermissionId from a string or number.\n *\n * @param id - The permission ID (typically a number from the contract)\n * @returns A branded CustomPermissionId\n */\nexport function createCustomPermissionId(id: string | number): CustomPermissionId {\n return String(id) as CustomPermissionId;\n}\n\n// ============================================================================\n// Metadata Types\n// ============================================================================\n\n/**\n * Metadata describing a custom permission in the marketplace.\n */\nexport interface CustomPermissionMetadata {\n /** Unique permission identifier */\n permissionId: CustomPermissionId;\n /** Address of the deployed permission contract */\n contractAddress: string;\n /** Human-readable name */\n name: string;\n /** Detailed description of what this permission checks */\n description: string;\n /** Semantic version string (e.g., \"1.0.0\") */\n version: string;\n /** Address of the permission creator */\n author: string;\n /** Categorization tags for discovery */\n tags: string[];\n /** Keccak256 hash of the contract bytecode */\n codeHash: string;\n /** Unix timestamp when registered */\n registrationTime: number;\n /** Number of agents currently using this permission */\n usageCount: number;\n /** Whether the permission has been audited/verified */\n verified: boolean;\n /** Whether the permission is available for use */\n active: boolean;\n}\n\n/**\n * Configuration for enabling a custom permission for an agent.\n */\nexport interface CustomPermissionConfig {\n /** The permission to enable */\n permissionId: CustomPermissionId;\n /**\n * Maximum gas allowed for checkPermission call.\n * Default: 100,000 gas\n * Range: 10,000 - 500,000 gas\n */\n gasBudget?: bigint;\n}\n\n/**\n * Agent-specific permission configuration (returned from contract).\n */\nexport interface AgentPermissionConfig {\n /** Maximum gas allowed for checkPermission call */\n gasBudget: bigint;\n /** Unix timestamp when the permission was enabled */\n enabledAt: number;\n /** Whether the permission is currently active for this agent */\n active: boolean;\n}\n\n// ============================================================================\n// Query Types\n// ============================================================================\n\n/**\n * Options for listing permissions in the marketplace.\n */\nexport interface ListPermissionsOptions {\n /** Filter by tag */\n tag?: string;\n /** Filter by author address */\n author?: string;\n /** Only show verified permissions */\n verifiedOnly?: boolean;\n /** Only show active permissions */\n activeOnly?: boolean;\n /** Maximum number of results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n /** Sort field */\n sortBy?: 'registrationTime' | 'usageCount' | 'name';\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Result of a permission check.\n */\nexport interface CustomPermissionCheckResult {\n /** Whether the action is allowed */\n allowed: boolean;\n /** The permission that denied the action (if any) */\n deniedByPermissionId?: CustomPermissionId;\n /** Human-readable reason for denial */\n reason?: string;\n}\n\n// ============================================================================\n// Deployment Types\n// ============================================================================\n\n/**\n * Options for deploying a custom permission.\n */\nexport interface DeployPermissionOptions {\n /** Human-readable name */\n name: string;\n /** Detailed description */\n description: string;\n /** Version string */\n version: string;\n /** Categorization tags */\n tags: string[];\n /** Compiled contract bytecode (0x prefixed hex string) */\n bytecode: string;\n /** Constructor arguments (ABI encoded) */\n constructorArgs?: string;\n}\n\n/**\n * Result of deploying a custom permission.\n */\nexport interface DeployPermissionResult {\n /** The assigned permission ID */\n permissionId: CustomPermissionId;\n /** Address of the deployed contract */\n contractAddress: string;\n /** Transaction hash of the deployment */\n txHash: string;\n /** Block number where the contract was deployed */\n blockNumber: number;\n}\n\n/**\n * Options for deploying from a template.\n */\nexport interface DeployFromTemplateOptions {\n /** Name of the template to use */\n templateName: string;\n /** Template-specific configuration */\n config: Record<string, unknown>;\n /** Human-readable name for the deployed permission */\n name?: string;\n /** Description override */\n description?: string;\n /** Categorization tags */\n tags?: string[];\n}\n\n// ============================================================================\n// Built-in Template Types\n// ============================================================================\n\n/**\n * Available built-in permission templates.\n */\nexport type BuiltInTemplateType =\n | 'max-daily-spend'\n | 'address-whitelist'\n | 'address-blacklist'\n | 'time-restricted'\n | 'action-type-filter'\n | 'value-threshold'\n | 'rate-limiter'\n | 'cooldown-enforcer';\n\n/**\n * Configuration for the max-daily-spend template.\n */\nexport interface MaxDailySpendConfig {\n /** Maximum amount per day (in wei) */\n maxDaily: bigint;\n /** Token address (address(0) for native ETH) */\n token?: string;\n}\n\n/**\n * Configuration for the address-whitelist template.\n */\nexport interface AddressWhitelistConfig {\n /** Whitelisted addresses */\n addresses: string[];\n /** Whether to check recipient or sender */\n checkField: 'recipient' | 'sender' | 'both';\n}\n\n/**\n * Configuration for the address-blacklist template.\n */\nexport interface AddressBlacklistConfig {\n /** Blacklisted addresses */\n addresses: string[];\n /** Whether to check recipient or sender */\n checkField: 'recipient' | 'sender' | 'both';\n}\n\n/**\n * Configuration for the time-restricted template.\n */\nexport interface TimeRestrictedConfig {\n /** Start hour (0-23, UTC) */\n startHour: number;\n /** End hour (0-23, UTC) */\n endHour: number;\n /** Allowed days (0 = Sunday, 6 = Saturday) */\n allowedDays?: number[];\n}\n\n/**\n * Configuration for the action-type-filter template.\n */\nexport interface ActionTypeFilterConfig {\n /** Allowed action type patterns */\n allowedPatterns: string[];\n /** Whether to use blocklist instead of allowlist */\n isBlocklist?: boolean;\n}\n\n/**\n * Configuration for the value-threshold template.\n */\nexport interface ValueThresholdConfig {\n /** Maximum value per transaction (in wei) */\n maxValue: bigint;\n /** Token address (address(0) for native ETH) */\n token?: string;\n}\n\n/**\n * Configuration for the rate-limiter template.\n */\nexport interface RateLimiterConfig {\n /** Maximum number of actions */\n maxActions: number;\n /** Time window in seconds */\n windowSeconds: number;\n /** Whether to track per action type */\n perActionType?: boolean;\n}\n\n/**\n * Configuration for the cooldown-enforcer template.\n */\nexport interface CooldownEnforcerConfig {\n /** Cooldown period in seconds */\n cooldownSeconds: number;\n /** Action types this applies to (empty = all) */\n actionTypes?: string[];\n}\n\n/**\n * Union type of all template configurations.\n */\nexport type TemplateConfig =\n | MaxDailySpendConfig\n | AddressWhitelistConfig\n | AddressBlacklistConfig\n | TimeRestrictedConfig\n | ActionTypeFilterConfig\n | ValueThresholdConfig\n | RateLimiterConfig\n | CooldownEnforcerConfig;\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\n/**\n * Event emitted when a permission is registered.\n */\nexport interface PermissionRegisteredEvent {\n type: 'permission-registered';\n permissionId: CustomPermissionId;\n contractAddress: string;\n author: string;\n name: string;\n blockNumber: number;\n txHash: string;\n timestamp: number;\n}\n\n/**\n * Event emitted when a permission version is updated.\n */\nexport interface PermissionVersionUpdatedEvent {\n type: 'permission-version-updated';\n permissionId: CustomPermissionId;\n oldContract: string;\n newContract: string;\n version: string;\n blockNumber: number;\n txHash: string;\n timestamp: number;\n}\n\n/**\n * Event emitted when an agent enables a permission.\n */\nexport interface PermissionEnabledEvent {\n type: 'permission-enabled';\n agent: string;\n permissionId: CustomPermissionId;\n gasBudget: bigint;\n blockNumber: number;\n txHash: string;\n timestamp: number;\n}\n\n/**\n * Event emitted when an agent disables a permission.\n */\nexport interface PermissionDisabledEvent {\n type: 'permission-disabled';\n agent: string;\n permissionId: CustomPermissionId;\n blockNumber: number;\n txHash: string;\n timestamp: number;\n}\n\n/**\n * Union type of all marketplace events.\n */\nexport type MarketplaceEvent =\n | PermissionRegisteredEvent\n | PermissionVersionUpdatedEvent\n | PermissionEnabledEvent\n | PermissionDisabledEvent;\n","/**\n * Supported chain configurations.\n */\nexport interface ChainConfig {\n /** Chain ID */\n id: number;\n /** Chain name */\n name: string;\n /** RPC URL */\n rpcUrl: string;\n /** Block explorer URL */\n explorerUrl: string;\n /** Whether this is a testnet */\n testnet: boolean;\n /** Default polling interval in ms (matches block time). Base L2 = 2s. */\n pollingInterval: number;\n}\n\n/**\n * Base mainnet configuration.\n */\n/**\n * Base mainnet configuration.\n *\n * For production, use a dedicated RPC provider (Alchemy, QuickNode, etc.)\n * via `rpcUrl` in InvarianceConfig for faster and more reliable responses.\n */\nexport const BASE_MAINNET: ChainConfig = {\n id: 8453,\n name: 'Base',\n rpcUrl: 'https://mainnet.base.org',\n explorerUrl: 'https://basescan.org',\n testnet: false,\n pollingInterval: 2_000,\n};\n\n/**\n * Base Sepolia testnet configuration.\n */\n/**\n * Base Sepolia testnet configuration.\n *\n * For production, use a dedicated RPC provider (Alchemy, QuickNode, etc.)\n * via `rpcUrl` in InvarianceConfig for faster and more reliable responses.\n */\nexport const BASE_SEPOLIA: ChainConfig = {\n id: 84532,\n name: 'Base Sepolia',\n rpcUrl: 'https://sepolia.base.org',\n explorerUrl: 'https://sepolia.basescan.org',\n testnet: true,\n pollingInterval: 2_000,\n};\n\n/**\n * All supported chains.\n */\nexport const SUPPORTED_CHAINS: Record<number, ChainConfig> = {\n [BASE_MAINNET.id]: BASE_MAINNET,\n [BASE_SEPOLIA.id]: BASE_SEPOLIA,\n};\n\n/**\n * Get chain config by ID.\n */\nexport function getChainConfig(chainId: number): ChainConfig | undefined {\n return SUPPORTED_CHAINS[chainId];\n}\n\n/**\n * Check if a chain is supported.\n */\nexport function isSupportedChain(chainId: number): boolean {\n return chainId in SUPPORTED_CHAINS;\n}\n","/**\n * Contract addresses for each supported chain.\n */\nexport interface ContractAddresses {\n /** InvarianceIdentity contract address */\n identity: string;\n /** InvarianceIntent contract address */\n intent: string;\n /** InvariancePolicy contract address */\n policy: string;\n /** InvarianceEscrow contract address */\n escrow: string;\n /** InvarianceLedger contract address */\n ledger: string;\n /** InvarianceReview contract address */\n review: string;\n /** InvarianceRegistry contract address */\n registry: string;\n /** InvarianceHire contract address (optional, used for marketplace hires) */\n hire?: string;\n /** USDC token contract address (optional, used for escrow/payments) */\n usdc?: string;\n /** InvarianceCompactLedger contract address (optional, gas-optimized ledger) */\n compactLedger?: string;\n /** InvarianceAtomicVerifier contract address (optional, single-tx verification) */\n atomicVerifier?: string;\n /** InvarianceVoting contract address (optional, off-chain batch voting) */\n voting?: string;\n}\n\n/** Contract addresses on Base mainnet. TODO: Update with deployed addresses */\nexport const BASE_MAINNET_CONTRACTS: ContractAddresses = {\n identity: '0x0000000000000000000000000000000000000000',\n intent: '0x0000000000000000000000000000000000000000',\n policy: '0x0000000000000000000000000000000000000000',\n escrow: '0x0000000000000000000000000000000000000000',\n ledger: '0x0000000000000000000000000000000000000000',\n review: '0x0000000000000000000000000000000000000000',\n registry: '0x0000000000000000000000000000000000000000',\n};\n\n/** Contract addresses on Base Sepolia testnet */\nexport const BASE_SEPOLIA_CONTRACTS: ContractAddresses = {\n identity: '0x98082761AC9ef71f5D2FD0D81Fa68DDe0a5f549d',\n intent: '0xBd6f5e95C18Bb7E913d56fdFa7a9e9b726Cf5F1D',\n policy: '0x476b03fa71f65D34AE95Cbd5E8c6833Fe5a0b7d9',\n escrow: '0x72E55D252385E761C1DEf0b705D3a6e7b341bbF6',\n ledger: '0xf9eeCe4534e43B8683d035D847EB80cf1d2591Bf',\n review: '0xB8A7246CAA56764c4b6ef18dc72379Cfc03505D3',\n registry: '0xd5Ea9F94B51B8aDb441d74450066173863509043',\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n};\n\n/** Contract addresses by chain ID */\nexport const CONTRACT_ADDRESSES: Record<number, ContractAddresses> = {\n 8453: BASE_MAINNET_CONTRACTS,\n 84532: BASE_SEPOLIA_CONTRACTS,\n};\n\n/**\n * Platform signer address for verifying attestation signatures.\n * This is the public address corresponding to the PLATFORM_SIGNING_KEY used by the backend.\n * Anyone can use this to verify that a platform attestation was genuinely signed by Invariance.\n */\nexport const PLATFORM_SIGNER_ADDRESS = '0x1234000000000000000000000000000000000000' as const;\n\n/** Get contract addresses for a chain */\nexport function getContractAddresses(chainId: number): ContractAddresses | undefined {\n return CONTRACT_ADDRESSES[chainId];\n}\n","import type { ActorType } from '../types/actions.js';\nimport type { ActionCategory } from '../types/policies.js';\n\n/**\n * Maximum uint256 value for unlimited maxValue.\n */\nexport const MAX_UINT256 = BigInt(\n '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n);\n\n/**\n * Default values for policy fields.\n * These are applied when creating policies without specifying all fields.\n */\nexport const DEFAULT_POLICY_VALUES = {\n /** Default policy version */\n version: '1.0.0',\n\n /** Default max gas per action (5 million gas) */\n maxGas: 5_000_000n,\n\n /** Default max value - unlimited */\n maxValue: MAX_UINT256,\n\n /** Default allowed actors - any actor type */\n allowedActors: ['any'] as ActorType[],\n\n /** Default cooldown between same-category actions (5 minutes) */\n cooldownSeconds: 300,\n\n /** Default action category */\n category: 'CUSTOM' as ActionCategory,\n} as const;\n\n/**\n * Apply default policy values to a partial policy configuration.\n *\n * @param partial - Partial policy configuration\n * @returns Complete policy configuration with defaults applied\n */\nexport function applyPolicyDefaults<T extends Partial<typeof DEFAULT_POLICY_VALUES>>(\n partial: T\n): T & typeof DEFAULT_POLICY_VALUES {\n return {\n ...DEFAULT_POLICY_VALUES,\n ...partial,\n };\n}\n","import { ErrorCode } from '@invariance/common';\n\n/**\n * Base error class for all Invariance SDK errors.\n *\n * Every SDK error carries a structured {@link ErrorCode} for programmatic handling,\n * along with optional explorer URL and transaction hash for on-chain debugging.\n *\n * @example\n * ```typescript\n * try {\n * await inv.intent.request(opts);\n * } catch (err) {\n * if (err instanceof InvarianceError) {\n * console.error(err.code, err.message, err.explorerUrl);\n * }\n * }\n * ```\n */\nexport class InvarianceError extends Error {\n /** Structured error code for programmatic handling */\n public readonly code: ErrorCode;\n\n /** Public explorer URL relevant to the error context */\n public readonly explorerUrl?: string | undefined;\n\n /** On-chain transaction hash related to the error */\n public readonly txHash?: string | undefined;\n\n constructor(\n code: ErrorCode,\n message: string,\n opts?: { explorerUrl?: string; txHash?: string },\n ) {\n super(message);\n this.name = 'InvarianceError';\n this.code = code;\n this.explorerUrl = opts?.explorerUrl;\n this.txHash = opts?.txHash;\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, InvarianceError);\n }\n }\n}\n"],"mappings":"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","names":["ErrorCode","mapped"]}
1
+ {"version":3,"sources":["../src/utils/contract-helpers.ts","../../packages/common/src/types/actions.ts","../../packages/common/src/types/errors.ts","../../packages/common/src/types/templates.ts","../../packages/common/src/types/custom-permissions.ts","../../packages/common/src/constants/chains.ts","../../packages/common/src/constants/contracts.ts","../../packages/common/src/defaults/policy-defaults.ts","../src/errors/InvarianceError.ts"],"sourcesContent":["import type { ActorType, ListingCategory } from '@invariance/common';\nimport type { PricingModel } from '@invariance/common';\nimport type { PublicClient, WalletClient } from 'viem';\nimport { keccak256, toHex, decodeEventLog, stringToHex, hexToString } from 'viem';\nimport { ErrorCode } from '@invariance/common';\nimport { InvarianceError } from '../errors/InvarianceError.js';\nimport { InvarianceIntentAbi } from '../contracts/abis/index.js';\nimport { InvarianceLedgerAbi } from '../contracts/abis/index.js';\nimport { InvarianceCompactLedgerAbi } from '../contracts/abis/index.js';\nimport { InvarianceAtomicVerifierAbi } from '../contracts/abis/index.js';\nimport { InvarianceReviewAbi } from '../contracts/abis/index.js';\nimport { InvarianceRegistryAbi } from '../contracts/abis/index.js';\n\n/** On-chain ActorType enum values */\nconst ACTOR_TYPE_MAP: Record<ActorType, number> = {\n agent: 0,\n human: 1,\n device: 2,\n service: 3,\n any: 255,\n};\n\nconst REVERSE_ACTOR_TYPE_MAP: Record<number, ActorType> = {\n 0: 'agent',\n 1: 'human',\n 2: 'device',\n 3: 'service',\n};\n\n/** On-chain IdentityStatus enum values */\nconst IDENTITY_STATUS_MAP: Record<number, 'active' | 'suspended' | 'deactivated'> = {\n 0: 'active',\n 1: 'suspended',\n 2: 'deactivated',\n};\n\n/**\n * Map SDK actor type string to on-chain uint8 enum value.\n *\n * @param type - The SDK actor type\n * @returns The on-chain enum value\n */\nexport function actorTypeToEnum(type: ActorType): number {\n const val = ACTOR_TYPE_MAP[type];\n if (val === undefined) {\n throw new InvarianceError(\n ErrorCode.INVALID_ACTOR_TYPE,\n `Unknown actor type: ${type as string}`,\n );\n }\n return val;\n}\n\n/**\n * Map on-chain uint8 enum value to SDK actor type string.\n *\n * @param val - The on-chain enum value\n * @returns The SDK actor type\n */\nexport function enumToActorType(val: number): ActorType {\n const type = REVERSE_ACTOR_TYPE_MAP[val];\n if (!type) {\n throw new InvarianceError(\n ErrorCode.INVALID_ACTOR_TYPE,\n `Unknown on-chain actor type enum: ${val}`,\n );\n }\n return type;\n}\n\n/**\n * Map on-chain IdentityStatus uint8 to SDK status string.\n *\n * @param val - The on-chain status enum value\n * @returns The SDK status string\n */\nexport function identityStatusFromEnum(val: number): 'active' | 'suspended' | 'deactivated' {\n const status = IDENTITY_STATUS_MAP[val];\n if (!status) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown on-chain identity status enum: ${val}`,\n );\n }\n return status;\n}\n\n/**\n * Encode a string ID to bytes32 for on-chain use.\n * If already a 0x-prefixed 66-char hex string, returns as-is.\n * Otherwise, pads the UTF-8 encoded string to 32 bytes.\n *\n * @param id - The string identity ID\n * @returns The bytes32 hex string\n */\nexport function toBytes32(id: string): `0x${string}` {\n // Already a bytes32 hex string\n if (id.startsWith('0x') && id.length === 66) {\n return id as `0x${string}`;\n }\n\n // Handle shorter 0x-prefixed hex strings (e.g., addresses) — pad to 32 bytes\n if (id.startsWith('0x') && /^0x[0-9a-fA-F]+$/.test(id)) {\n const hexPart = id.slice(2);\n if (hexPart.length > 64) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Hex ID exceeds 32 bytes: \"${id}\". Use a shorter identifier or hash it first.`,\n );\n }\n // Left-pad hex values to preserve numeric semantics (0x1 → 0x0100...00, not 0x1000...00)\n return `0x${hexPart.padStart(64, '0')}`;\n }\n\n // Encode string to bytes32 by padding\n const hex = stringToHex(id);\n const hexBody = hex.slice(2);\n if (hexBody.length > 64) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `ID exceeds 32 bytes: \"${id}\" (${hexBody.length / 2} bytes). Use a shorter identifier or hash it first.`,\n );\n }\n return `0x${hexBody.padEnd(64, '0')}`;\n}\n\n/**\n * Decode a bytes32 hex string back to a string representation.\n * Strips trailing zero bytes.\n *\n * @param bytes - The bytes32 hex string\n * @returns The decoded string\n */\nexport function fromBytes32(bytes: `0x${string}`): string {\n const hex = bytes.slice(2);\n // Remove trailing zeros (pairs of 00)\n const trimmed = hex.replace(/(00)+$/, '');\n if (trimmed.length === 0) return '';\n let decoded: string;\n try {\n decoded = hexToString(`0x${trimmed}`);\n } catch {\n console.warn(`[Invariance] fromBytes32: failed to decode hex as UTF-8 string, returning raw hex: ${bytes}`);\n return bytes;\n }\n // If decoded string contains replacement characters or non-printable bytes,\n // it's likely a raw hash — return the original hex to ensure round-trip safety\n const reencoded = stringToHex(decoded).slice(2);\n if (/[\\uFFFD]/.test(decoded) || reencoded.toLowerCase() !== trimmed.toLowerCase()) {\n console.warn(`[Invariance] fromBytes32: round-trip decode mismatch, returning raw hex: ${bytes}`);\n return bytes;\n }\n return decoded;\n}\n\n/** Receipt returned by waitForReceipt */\nexport interface TxReceipt {\n txHash: string;\n blockNumber: number;\n gasUsed: string;\n status: 'success' | 'reverted';\n logs: readonly { topics: readonly string[]; data: string }[];\n}\n\n/** Options for waitForReceipt */\nexport interface WaitForReceiptOptions {\n /** Skip waiting and return an optimistic result with only the txHash */\n optimistic?: boolean;\n /** Transaction confirmation timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Wait for a transaction receipt and verify success.\n *\n * @param publicClient - The viem PublicClient (prefer WS-backed for speed)\n * @param txHash - The transaction hash to wait for\n * @param options - Optional settings (optimistic mode, etc.)\n * @returns The transaction receipt\n * @throws {InvarianceError} If the transaction reverted\n */\nexport async function waitForReceipt(\n publicClient: PublicClient,\n txHash: `0x${string}`,\n options?: WaitForReceiptOptions,\n): Promise<TxReceipt> {\n // Optimistic mode: return immediately with the tx hash, skip receipt wait\n if (options?.optimistic) {\n return {\n txHash,\n blockNumber: 0,\n gasUsed: '0',\n status: 'success',\n logs: [],\n };\n }\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n timeout: options?.timeout ?? 30_000,\n confirmations: 1,\n });\n\n const result: TxReceipt = {\n txHash: receipt.transactionHash,\n blockNumber: Number(receipt.blockNumber),\n gasUsed: receipt.gasUsed.toString(),\n status: receipt.status as 'success' | 'reverted',\n logs: receipt.logs.map((log) => ({\n topics: log.topics as readonly string[],\n data: log.data,\n })),\n };\n\n if (receipt.status === 'reverted') {\n throw new InvarianceError(\n ErrorCode.TX_REVERTED,\n `Transaction reverted: ${txHash}`,\n { txHash },\n );\n }\n\n return result;\n}\n\n/** On-chain PolicyState enum values */\nconst POLICY_STATE_MAP: Record<number, 'active' | 'revoked' | 'expired'> = {\n 0: 'active',\n 1: 'revoked',\n 2: 'expired',\n};\n\n/** On-chain PolicyRuleType enum values */\nconst POLICY_RULE_TYPE_MAP: Record<string, number> = {\n 'max-spend': 0,\n 'max-per-tx': 1,\n 'daily-limit': 2,\n 'action-whitelist': 3,\n 'action-blacklist': 4,\n 'target-whitelist': 5,\n 'target-blacklist': 6,\n 'time-window': 7,\n 'cooldown': 8,\n 'rate-limit': 9,\n 'require-state': 10,\n 'require-balance': 11,\n 'require-approval': 12,\n 'require-attestation': 13,\n // Off-chain only: encoded as Custom on-chain\n 'require-payment': 14,\n 'custom': 14,\n};\n\nconst REVERSE_POLICY_RULE_TYPE_MAP: Record<number, string> = {\n 0: 'max-spend',\n 1: 'max-per-tx',\n 2: 'daily-limit',\n 3: 'action-whitelist',\n 4: 'action-blacklist',\n 5: 'target-whitelist',\n 6: 'target-blacklist',\n 7: 'time-window',\n 8: 'cooldown',\n 9: 'rate-limit',\n 10: 'require-state',\n 11: 'require-balance',\n 12: 'require-approval',\n 13: 'require-attestation',\n 14: 'custom',\n};\n\n/**\n * Map SDK policy rule type string to on-chain uint8 enum value.\n *\n * @param type - The SDK policy rule type\n * @returns The on-chain enum value\n */\nexport function policyRuleTypeToEnum(type: string): number {\n const val = POLICY_RULE_TYPE_MAP[type];\n if (val === undefined) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown policy rule type: ${type}`,\n );\n }\n return val;\n}\n\n/**\n * Map on-chain uint8 enum value to SDK policy rule type string.\n *\n * @param val - The on-chain enum value\n * @returns The SDK policy rule type\n */\nexport function enumToPolicyRuleType(val: number): string {\n const type = REVERSE_POLICY_RULE_TYPE_MAP[val];\n if (!type) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown on-chain policy rule type enum: ${val}`,\n );\n }\n return type;\n}\n\n/**\n * Map on-chain PolicyState uint8 to SDK state string.\n *\n * @param val - The on-chain state enum value\n * @returns The SDK state string\n */\nexport function policyStateFromEnum(val: number): 'active' | 'revoked' | 'expired' {\n const state = POLICY_STATE_MAP[val];\n if (!state) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown on-chain policy state enum: ${val}`,\n );\n }\n return state;\n}\n\n/**\n * Map an array of SDK actor types to on-chain uint8 enum values.\n *\n * @param types - Array of SDK actor types\n * @returns Array of on-chain enum values\n */\nexport function mapActorTypesToEnums(types: ActorType[]): number[] {\n return types.map(actorTypeToEnum);\n}\n\n/** On-chain EscrowState enum values */\nconst ESCROW_STATE_MAP: Record<number, 'created' | 'funded' | 'active' | 'released' | 'refunded' | 'disputed' | 'resolved'> = {\n 0: 'created',\n 1: 'funded',\n 2: 'active',\n 3: 'released',\n 4: 'refunded',\n 5: 'disputed',\n 6: 'resolved',\n};\n\n/** On-chain EscrowConditionType enum values */\nconst ESCROW_CONDITION_TYPE_MAP: Record<string, number> = {\n 'task-completion': 0,\n 'multi-sig': 1,\n 'intent-verified': 2,\n 'milestone': 3,\n};\n\nconst REVERSE_ESCROW_CONDITION_TYPE_MAP: Record<number, 'task-completion' | 'multi-sig' | 'intent-verified' | 'milestone'> = {\n 0: 'task-completion',\n 1: 'multi-sig',\n 2: 'intent-verified',\n 3: 'milestone',\n};\n\n/**\n * Map SDK escrow condition type string to on-chain uint8 enum value.\n *\n * @param type - The SDK escrow condition type\n * @returns The on-chain enum value\n */\nexport function escrowConditionTypeToEnum(type: 'task-completion' | 'multi-sig' | 'intent-verified' | 'milestone'): number {\n const val = ESCROW_CONDITION_TYPE_MAP[type];\n if (val === undefined) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown escrow condition type: ${type}`,\n );\n }\n return val;\n}\n\n/**\n * Map on-chain uint8 enum value to SDK escrow condition type string.\n *\n * @param val - The on-chain enum value\n * @returns The SDK escrow condition type\n */\nexport function enumToEscrowConditionType(val: number): 'task-completion' | 'multi-sig' | 'intent-verified' | 'milestone' {\n const type = REVERSE_ESCROW_CONDITION_TYPE_MAP[val];\n if (!type) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown on-chain escrow condition type enum: ${val}`,\n );\n }\n return type;\n}\n\n/**\n * Map on-chain EscrowState uint8 to SDK state string.\n *\n * @param val - The on-chain state enum value\n * @returns The SDK state string\n */\nexport function escrowStateFromEnum(val: number): 'created' | 'funded' | 'active' | 'released' | 'refunded' | 'disputed' | 'resolved' {\n const state = ESCROW_STATE_MAP[val];\n if (state === undefined) {\n throw new InvarianceError(\n ErrorCode.ESCROW_NOT_FOUND,\n `Unknown on-chain escrow state enum: ${val}`,\n );\n }\n return state;\n}\n\n/** Known contract error names mapped to SDK error codes */\nconst CONTRACT_ERROR_MAP: Record<string, ErrorCode> = {\n IdentityNotFound: ErrorCode.IDENTITY_NOT_FOUND,\n NotIdentityOwner: ErrorCode.NOT_AUTHORIZED_SIGNER,\n AddressAlreadyRegistered: ErrorCode.INVALID_INPUT,\n IdentityNotActive: ErrorCode.IDENTITY_SUSPENDED,\n IdentityAlreadyDeactivated: ErrorCode.IDENTITY_SUSPENDED,\n IdentityNotSuspended: ErrorCode.IDENTITY_NOT_FOUND,\n InvalidAddress: ErrorCode.INVALID_INPUT,\n AttestationNotFound: ErrorCode.IDENTITY_NOT_FOUND,\n AttestationAlreadyRevoked: ErrorCode.IDENTITY_NOT_FOUND,\n NotAttester: ErrorCode.NOT_AUTHORIZED_SIGNER,\n AccessControlUnauthorizedAccount: ErrorCode.NOT_AUTHORIZED_SIGNER,\n // Escrow-specific errors\n EscrowNotFound: ErrorCode.ESCROW_NOT_FOUND,\n InvalidAmount: ErrorCode.INVALID_INPUT,\n InvalidBeneficiary: ErrorCode.INVALID_INPUT,\n NotDepositor: ErrorCode.NOT_AUTHORIZED_SIGNER,\n NotBeneficiary: ErrorCode.NOT_AUTHORIZED_SIGNER,\n NotParty: ErrorCode.NOT_AUTHORIZED_SIGNER,\n InvalidState: ErrorCode.ESCROW_WRONG_STATE,\n AlreadyFunded: ErrorCode.ESCROW_WRONG_STATE,\n NotFunded: ErrorCode.ESCROW_WRONG_STATE,\n AlreadyApproved: ErrorCode.ESCROW_WRONG_STATE,\n NotSigner: ErrorCode.NOT_AUTHORIZED_SIGNER,\n ThresholdNotMet: ErrorCode.ESCROW_WRONG_STATE,\n EscrowExpired: ErrorCode.ESCROW_WRONG_STATE,\n DisputeAlreadyExists: ErrorCode.ESCROW_WRONG_STATE,\n DisputeNotFound: ErrorCode.ESCROW_NOT_FOUND,\n DisputeAlreadyResolved: ErrorCode.ESCROW_WRONG_STATE,\n // Policy-specific errors\n PolicyNotFound: ErrorCode.POLICY_VIOLATION,\n PolicyNotActive: ErrorCode.POLICY_VIOLATION,\n PolicyAlreadyAttached: ErrorCode.POLICY_VIOLATION,\n PolicyNotAttached: ErrorCode.POLICY_VIOLATION,\n NotPolicyCreator: ErrorCode.NOT_AUTHORIZED_SIGNER,\n NoRulesProvided: ErrorCode.POLICY_VIOLATION,\n InvalidExpiresAt: ErrorCode.POLICY_VIOLATION,\n // Intent-specific errors\n IntentNotFound: ErrorCode.INVALID_INPUT,\n IntentNotPending: ErrorCode.INTENT_REJECTED,\n IntentNotApproved: ErrorCode.INTENT_REJECTED,\n IntentNotExecuting: ErrorCode.INTENT_REJECTED,\n IntentExpiredError: ErrorCode.INTENT_EXPIRED,\n NotRequester: ErrorCode.NOT_AUTHORIZED_SIGNER,\n PolicyDenied: ErrorCode.POLICY_VIOLATION,\n InvalidExpiration: ErrorCode.INVALID_INPUT,\n // Registry-specific errors\n ListingNotFound: ErrorCode.INVALID_INPUT,\n NotListingOwner: ErrorCode.NOT_AUTHORIZED_SIGNER,\n ListingAlreadyInactive: ErrorCode.INVALID_INPUT,\n EmptyName: ErrorCode.INVALID_INPUT,\n // Review-specific errors\n ReviewNotFound: ErrorCode.INVALID_INPUT,\n EscrowNotCompleted: ErrorCode.ESCROW_WRONG_STATE,\n NotEscrowParty: ErrorCode.NOT_AUTHORIZED_SIGNER,\n AlreadyReviewed: ErrorCode.ALREADY_REVIEWED,\n};\n\n/**\n * Map a viem contract revert error to a typed InvarianceError.\n *\n * @param error - The caught error (typically a viem ContractFunctionRevertedError)\n * @returns An InvarianceError with the appropriate error code\n */\nexport function mapContractError(error: unknown): InvarianceError {\n if (error instanceof InvarianceError) {\n return error;\n }\n\n // Handle viem ContractFunctionRevertedError\n if (\n error !== null &&\n typeof error === 'object' &&\n 'name' in error &&\n (error as { name: string }).name === 'ContractFunctionRevertedError'\n ) {\n const revertError = error as {\n name: string;\n data?: { errorName?: string };\n message: string;\n };\n const errorName = revertError.data?.errorName;\n if (errorName && errorName in CONTRACT_ERROR_MAP) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const mapped = new InvarianceError(CONTRACT_ERROR_MAP[errorName]!, errorName);\n mapped.cause = error;\n return mapped;\n }\n const mapped = new InvarianceError(ErrorCode.TX_REVERTED, revertError.message);\n mapped.cause = error;\n return mapped;\n }\n\n // Generic error fallback\n const message = error instanceof Error ? error.message : 'Unknown contract error';\n const mapped = new InvarianceError(ErrorCode.NETWORK_ERROR, message);\n mapped.cause = error;\n return mapped;\n}\n\n/*//////////////////////////////////////////////////////////////\n INTENT PROTOCOL HELPERS\n//////////////////////////////////////////////////////////////*/\n\n/** On-chain IntentStatus enum values */\nconst INTENT_STATUS_MAP: Record<number, 'pending' | 'approved' | 'executing' | 'completed' | 'rejected' | 'expired'> = {\n 0: 'pending',\n 1: 'approved',\n 2: 'executing',\n 3: 'completed',\n 4: 'rejected',\n 5: 'expired',\n};\n\n/**\n * Map on-chain IntentStatus uint8 to SDK lifecycle string.\n *\n * @param val - The on-chain status enum value\n * @returns The SDK lifecycle string\n */\nexport function intentStatusFromEnum(val: number): 'pending' | 'approved' | 'executing' | 'completed' | 'rejected' | 'expired' {\n const status = INTENT_STATUS_MAP[val];\n if (!status) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown on-chain intent status enum: ${val}`,\n );\n }\n return status;\n}\n\n/**\n * Parse intentId from transaction logs.\n * Looks for the IntentRequested event and extracts the intentId.\n *\n * @param logs - Transaction receipt logs\n * @returns The intent ID as bytes32 hex string\n */\nexport function parseIntentIdFromLogs(logs: readonly { topics: readonly string[]; data: string }[]): `0x${string}` {\n for (const log of logs) {\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 return (decoded.args as { intentId: `0x${string}` }).intentId;\n }\n } catch {\n continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.TX_REVERTED,\n 'IntentRequested event not found in transaction logs',\n );\n}\n\n/**\n * Hash metadata object to bytes32 for on-chain storage.\n * Uses keccak256 of JSON-stringified metadata.\n *\n * @param metadata - The metadata object to hash\n * @returns The keccak256 hash as bytes32 hex string\n */\nexport function hashMetadata(metadata: Record<string, unknown>): `0x${string}` {\n const json = JSON.stringify(metadata);\n return keccak256(toHex(json));\n}\n\n/*//////////////////////////////////////////////////////////////\n EVENT LEDGER HELPERS\n//////////////////////////////////////////////////////////////*/\n\n/** On-chain Severity enum values */\nconst SEVERITY_MAP: Record<'info' | 'warn' | 'error', number> = {\n info: 0,\n warn: 1,\n error: 2,\n};\n\n/**\n * Map SDK severity string to on-chain uint8 enum value.\n *\n * @param severity - The SDK severity level\n * @returns The on-chain enum value\n */\nexport function mapSeverity(severity: 'info' | 'warn' | 'error'): number {\n return SEVERITY_MAP[severity];\n}\n\n/**\n * Parse entryId from transaction logs.\n * Looks for the EntryLogged event and extracts the entryId.\n *\n * @param logs - Transaction receipt logs\n * @returns The entry ID as bytes32 hex string\n */\nexport function parseEntryIdFromLogs(logs: readonly { topics: readonly string[]; data: string }[]): `0x${string}` {\n for (const log of logs) {\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 return (decoded.args as { entryId: `0x${string}` }).entryId;\n }\n } catch {\n continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.TX_REVERTED,\n 'EntryLogged event not found in transaction logs',\n );\n}\n\n/** EIP-712 domain for CompactLedger signatures */\nexport interface CompactLedgerDomain {\n name: string;\n version: string;\n chainId: number;\n verifyingContract: `0x${string}`;\n}\n\n/** EIP-712 type definition for CompactLedger LogEntry */\nconst COMPACT_LEDGER_TYPES = {\n LogEntry: [\n { name: 'actorIdentityId', type: 'bytes32' },\n { name: 'actorAddress', type: 'address' },\n { name: 'action', type: 'string' },\n { name: 'category', type: 'string' },\n { name: 'metadataHash', type: 'bytes32' },\n { name: 'proofHash', type: 'bytes32' },\n { name: 'severity', type: 'uint8' },\n ],\n} as const;\n\n/**\n * Generate an EIP-712 typed-data actor signature for the CompactLedger.\n *\n * The CompactLedger contract verifies this signature on-chain via ECDSA.recover,\n * so a real wallet signature is required (no keccak fallback).\n *\n * @param input - The compact log input struct fields\n * @param domain - EIP-712 domain parameters\n * @param walletClient - The actor's viem WalletClient (must have an account)\n * @returns The EIP-712 signature as a hex string\n */\nexport async function generateActorSignatureEIP712(\n input: {\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 domain: CompactLedgerDomain,\n walletClient: WalletClient,\n): Promise<`0x${string}`> {\n const account = walletClient.account;\n if (!account) {\n throw new InvarianceError(\n ErrorCode.WALLET_NOT_CONNECTED,\n 'EIP-712 signing requires a connected wallet account. No keccak fallback is available for CompactLedger.',\n );\n }\n return walletClient.signTypedData({\n account,\n domain,\n types: COMPACT_LEDGER_TYPES,\n primaryType: 'LogEntry',\n message: {\n actorIdentityId: input.actorIdentityId,\n actorAddress: input.actorAddress as `0x${string}`,\n action: input.action,\n category: input.category,\n metadataHash: input.metadataHash,\n proofHash: input.proofHash,\n severity: input.severity,\n },\n });\n}\n\n/**\n * Generate an EIP-712 platform attestation via the backend API.\n *\n * CompactLedger requires a real ECDSA signature from the platform signer.\n * The keccak256 fallback will fail on-chain, so an API key is mandatory.\n *\n * @param input - The compact log input struct fields\n * @param apiKey - API key for authenticated attestation (required)\n * @param apiBaseUrl - Optional API base URL override\n * @returns The platform's EIP-712 ECDSA signature\n * @throws {InvarianceError} If no API key is provided\n */\nexport async function generatePlatformAttestationEIP712(\n input: {\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 apiKey: string | undefined,\n apiBaseUrl?: string,\n): Promise<`0x${string}`> {\n if (!apiKey) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n 'CompactLedger requires an API key for platform attestation. The keccak256 fallback is not a valid ECDSA signature and will revert on-chain. Set apiKey in your Invariance config.',\n );\n }\n\n const envUrl = typeof process !== 'undefined' ? process.env['INVARIANCE_API_URL'] : undefined;\n const baseUrl = apiBaseUrl ?? envUrl ?? 'https://api.useinvariance.com';\n\n const response = await fetch(`${baseUrl}/v1/attest`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n mode: 'eip712',\n input: {\n actorIdentityId: input.actorIdentityId,\n actorAddress: input.actorAddress,\n action: input.action,\n category: input.category,\n metadataHash: input.metadataHash,\n proofHash: input.proofHash,\n severity: input.severity,\n },\n }),\n });\n\n if (!response.ok) {\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Platform attestation API returned ${response.status}. CompactLedger requires a valid platform signature.`,\n );\n }\n\n const result = await response.json() as { data: { signature: string } };\n return result.data.signature as `0x${string}`;\n}\n\n/**\n * Parse entryId from CompactLedger transaction logs.\n * Looks for the EntryLogged event from the CompactLedger ABI.\n *\n * @param logs - Transaction receipt logs\n * @returns The entry ID as bytes32 hex string\n */\nexport function parseCompactEntryIdFromLogs(logs: readonly { topics: readonly string[]; data: string }[]): `0x${string}` {\n for (const log of logs) {\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 return (decoded.args as { entryId: `0x${string}` }).entryId;\n }\n } catch {\n continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.TX_REVERTED,\n 'CompactLedger EntryLogged event not found in transaction logs',\n );\n}\n\n/**\n * Parse entryId from AtomicVerifier transaction logs.\n * Looks for the AtomicVerification event.\n *\n * @param logs - Transaction receipt logs\n * @returns The entry ID as bytes32 hex string\n */\nexport function parseAtomicEntryIdFromLogs(logs: readonly { topics: readonly string[]; data: string }[]): `0x${string}` {\n for (const log of logs) {\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 return (decoded.args as { entryId: `0x${string}` }).entryId;\n }\n } catch {\n continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.TX_REVERTED,\n 'AtomicVerification event not found in transaction logs',\n );\n}\n\n/**\n * Generate actor signature for ledger entry.\n * Signs the event payload with the actor's wallet.\n *\n * @param event - The ledger event being signed\n * @param walletClient - The actor's viem WalletClient\n * @returns The actor's signature\n */\nexport async function generateActorSignature(\n event: { action: string; metadata?: Record<string, unknown> },\n walletClient: WalletClient,\n): Promise<string> {\n const message = JSON.stringify({ action: event.action, metadata: event.metadata ?? {} });\n const account = walletClient.account;\n if (!account) {\n // Fallback: deterministic commitment hash when no account is available\n return keccak256(toHex(message));\n }\n return walletClient.signMessage({ account, message });\n}\n\n/**\n * Generate platform co-signature for ledger entry.\n * Produces a keccak256 commitment hash of the event.\n *\n * @security WARNING: This is NOT a cryptographic signature. It is a deterministic\n * keccak256 hash with no private key involved. Anyone who knows the event data\n * can reproduce this hash. In production, replace with server-side ECDSA signing\n * using the platform's private key to provide authentic platform attestation.\n *\n * @param event - The ledger event being co-signed\n * @returns The platform's commitment hash (NOT a real signature)\n */\nexport function generatePlatformCommitment(event: { action: string; metadata?: Record<string, unknown> }): string {\n const payload = JSON.stringify({ action: event.action, metadata: event.metadata ?? {}, platform: 'Invariance' });\n return keccak256(toHex(payload));\n}\n\n/**\n * Generate a real ECDSA platform attestation via the backend API.\n *\n * When an API key is provided, calls POST /v1/attest to obtain a server-signed\n * attestation. Without an API key, falls back to the unsigned keccak256 commitment.\n *\n * @param event - The ledger event being attested\n * @param apiKey - Optional API key for authenticated attestation\n * @param apiBaseUrl - Optional API base URL override\n * @returns The platform signature (ECDSA if API key provided, keccak256 hash otherwise)\n */\nexport async function generatePlatformAttestation(\n event: { action: string; metadata?: Record<string, unknown> },\n apiKey?: string,\n apiBaseUrl?: string,\n): Promise<string> {\n if (!apiKey) {\n return generatePlatformCommitment(event);\n }\n\n const envUrl = typeof process !== 'undefined' ? process.env['INVARIANCE_API_URL'] : undefined;\n const baseUrl = apiBaseUrl ?? envUrl ?? 'https://api.useinvariance.com';\n\n try {\n const response = await fetch(`${baseUrl}/v1/attest`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n action: event.action,\n metadata: event.metadata ?? {},\n }),\n });\n\n if (!response.ok) {\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Attestation API returned ${response.status}. Cannot generate platform signature.`,\n );\n }\n\n const result = await response.json() as Record<string, unknown>;\n const data = result['data'] as Record<string, unknown> | undefined;\n if (!data || typeof data['signature'] !== 'string') {\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n 'Attestation API returned invalid response shape. Expected { data: { signature: string } }.',\n );\n }\n return data['signature'] as string;\n } catch (err) {\n if (err instanceof InvarianceError) throw err;\n throw new InvarianceError(\n ErrorCode.NETWORK_ERROR,\n `Attestation API unreachable: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Convert array of ledger entries to CSV format.\n *\n * @param entries - Array of ledger entries\n * @returns CSV-formatted string\n */\nexport function convertToCSV(entries: Array<{ entryId: string; action: string; timestamp: number; txHash: string }>): string {\n if (entries.length === 0) return 'entryId,action,timestamp,txHash\\n';\n\n const sanitize = (v: string): string => {\n const first = v.charAt(0);\n if (first === '=' || first === '+' || first === '-' || first === '@') {\n return `'${v}`;\n }\n return v.includes(',') || v.includes('\"') ? `\"${v.replace(/\"/g, '\"\"')}\"` : v;\n };\n const headers = 'entryId,action,timestamp,txHash\\n';\n const rows = entries.map((e) => `${sanitize(e.entryId)},${sanitize(e.action)},${e.timestamp},${sanitize(e.txHash)}`).join('\\n');\n return headers + rows;\n}\n\n/*//////////////////////////////////////////////////////////////\n REPUTATION ENGINE HELPERS\n//////////////////////////////////////////////////////////////*/\n\n/**\n * Parse reviewId from transaction logs.\n * Looks for the ReviewSubmitted event and extracts the reviewId.\n *\n * @param logs - Transaction receipt logs\n * @returns The review ID as bytes32 hex string\n */\nexport function parseReviewIdFromLogs(logs: readonly { topics: readonly string[]; data: string }[]): `0x${string}` {\n for (const log of logs) {\n try {\n const decoded = decodeEventLog({\n abi: InvarianceReviewAbi,\n data: log.data as `0x${string}`,\n topics: log.topics as [`0x${string}`, ...`0x${string}`[]],\n });\n if (decoded.eventName === 'ReviewSubmitted') {\n return (decoded.args as { reviewId: `0x${string}` }).reviewId;\n }\n } catch {\n continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.TX_REVERTED,\n 'ReviewSubmitted event not found in transaction logs',\n );\n}\n\n/*//////////////////////////////////////////////////////////////\n MARKETPLACE REGISTRY HELPERS\n//////////////////////////////////////////////////////////////*/\n\n/** On-chain ListingCategory enum values */\nconst LISTING_CATEGORY_MAP: Record<ListingCategory, number> = {\n trading: 0,\n content: 1,\n analysis: 2,\n automation: 3,\n research: 4,\n creative: 5,\n development: 6,\n custom: 7,\n};\n\nconst REVERSE_LISTING_CATEGORY_MAP: Record<number, ListingCategory> = {\n 0: 'trading',\n 1: 'content',\n 2: 'analysis',\n 3: 'automation',\n 4: 'research',\n 5: 'creative',\n 6: 'development',\n 7: 'custom',\n};\n\n/** On-chain PricingType enum values */\nconst PRICING_TYPE_MAP: Record<PricingModel['type'], number> = {\n fixed: 0,\n hourly: 1,\n 'per-task': 2,\n subscription: 3,\n};\n\nconst REVERSE_PRICING_TYPE_MAP: Record<number, PricingModel['type']> = {\n 0: 'fixed',\n 1: 'hourly',\n 2: 'per-task',\n 3: 'subscription',\n};\n\n/**\n * Map SDK listing category string to on-chain uint8 enum value.\n *\n * @param category - The SDK listing category\n * @returns The on-chain enum value\n */\nexport function listingCategoryToEnum(category: ListingCategory): number {\n const val = LISTING_CATEGORY_MAP[category];\n if (val === undefined) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown listing category: ${category}`,\n );\n }\n return val;\n}\n\n/**\n * Map on-chain uint8 enum value to SDK listing category string.\n *\n * @param val - The on-chain enum value\n * @returns The SDK listing category\n */\nexport function enumToListingCategory(val: number): ListingCategory {\n const category = REVERSE_LISTING_CATEGORY_MAP[val];\n if (!category) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown on-chain listing category enum: ${val}`,\n );\n }\n return category;\n}\n\n/**\n * Map SDK pricing type string to on-chain uint8 enum value.\n *\n * @param type - The SDK pricing type\n * @returns The on-chain enum value\n */\nexport function pricingTypeToEnum(type: PricingModel['type']): number {\n const val = PRICING_TYPE_MAP[type];\n if (val === undefined) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown pricing type: ${type}`,\n );\n }\n return val;\n}\n\n/**\n * Map on-chain uint8 enum value to SDK pricing type string.\n *\n * @param val - The on-chain enum value\n * @returns The SDK pricing type\n */\nexport function enumToPricingType(val: number): PricingModel['type'] {\n const type = REVERSE_PRICING_TYPE_MAP[val];\n if (!type) {\n throw new InvarianceError(\n ErrorCode.INVALID_INPUT,\n `Unknown on-chain pricing type enum: ${val}`,\n );\n }\n return type;\n}\n\n/**\n * Parse listingId from transaction logs.\n * Looks for the ListingRegistered event and extracts the listingId.\n *\n * @param logs - Transaction receipt logs\n * @returns The listing ID as bytes32 hex string\n */\nexport function parseListingIdFromLogs(logs: readonly { topics: readonly string[]; data: string }[]): `0x${string}` {\n for (const log of logs) {\n try {\n const decoded = decodeEventLog({\n abi: InvarianceRegistryAbi,\n data: log.data as `0x${string}`,\n topics: log.topics as [`0x${string}`, ...`0x${string}`[]],\n });\n if (decoded.eventName === 'ListingRegistered') {\n return (decoded.args as { listingId: `0x${string}` }).listingId;\n }\n } catch {\n continue;\n }\n }\n\n throw new InvarianceError(\n ErrorCode.TX_REVERTED,\n 'ListingRegistered event not found in transaction logs',\n );\n}\n","import type { ActionCategory } from './policies.js';\n\n/**\n * Actor types supported by the Invariance Protocol.\n */\nexport type ActorType = 'agent' | 'human' | 'device' | 'service' | 'any';\n\n/**\n * Branded type for agent identifiers.\n */\ndeclare const AgentIdBrand: unique symbol;\nexport type AgentId = string & { readonly [AgentIdBrand]: typeof AgentIdBrand };\n\n/**\n * Branded type for action identifiers.\n */\ndeclare const ActionIdBrand: unique symbol;\nexport type ActionId = string & { readonly [ActionIdBrand]: typeof ActionIdBrand };\n\n/**\n * Branded type for task identifiers.\n */\ndeclare const TaskIdBrand: unique symbol;\nexport type TaskId = string & { readonly [TaskIdBrand]: typeof TaskIdBrand };\n\n/**\n * Branded type for intent hash identifiers.\n * Intent hash = hash(action + params + policyHash)\n */\ndeclare const IntentHashBrand: unique symbol;\nexport type IntentHash = string & { readonly [IntentHashBrand]: typeof IntentHashBrand };\n\n/**\n * Represents an action that an agent wants to execute.\n */\nexport interface Action {\n /** Unique action identifier */\n id: ActionId;\n /** The type of action being performed */\n type: string;\n /** Action-specific parameters */\n params: Record<string, unknown>;\n /** Unix timestamp when the action was created */\n timestamp: number;\n}\n\n/**\n * Input for creating a new action.\n */\nexport interface ActionInput {\n /** The type of action being performed */\n type: string;\n /** Action-specific parameters */\n params: Record<string, unknown>;\n}\n\n/**\n * Result of an action execution.\n */\nexport interface ActionResult {\n /** Whether the action was successful */\n success: boolean;\n /** The action that was executed */\n action: Action;\n /** Transaction hash on-chain */\n txHash: string;\n /** Block number where the action was logged */\n blockNumber: number;\n /** Any error message if the action failed */\n error?: string;\n}\n\n/**\n * Extended action result with provenance tracking.\n * Includes intent hash, policy version, and optional runtime fingerprint.\n */\nexport interface ActionResultWithProvenance extends ActionResult {\n /** Intent hash: hash(action + params + policyHash) */\n intentHash: IntentHash;\n /** Hash of policy config used for this action */\n policyHash: string;\n /** Policy version at execution time */\n policyVersion: string;\n /** Action category */\n category: ActionCategory;\n /** Value moved in this action (in wei) */\n valueMoved: bigint;\n /** Gas used for execution */\n gasUsed: bigint;\n /** Optional: hash(SDK version + agent code hash) */\n runtimeFingerprint?: string;\n}\n\n/**\n * Create an AgentId from a string (unsafe, no validation).\n */\nexport function createAgentId(id: string): AgentId {\n return id as AgentId;\n}\n\n/**\n * Create an ActionId from a string (unsafe, no validation).\n */\nexport function createActionId(id: string): ActionId {\n return id as ActionId;\n}\n\n/**\n * Create a TaskId from a string (unsafe, no validation).\n */\nexport function createTaskId(id: string): TaskId {\n return id as TaskId;\n}\n\n/**\n * Create an IntentHash from a string (unsafe, no validation).\n */\nexport function createIntentHash(hash: string): IntentHash {\n return hash as IntentHash;\n}\n","/** Error codes for all Invariance SDK operations */\nexport enum ErrorCode {\n IDENTITY_NOT_FOUND = 'IDENTITY_NOT_FOUND',\n IDENTITY_SUSPENDED = 'IDENTITY_SUSPENDED',\n INVALID_ACTOR_TYPE = 'INVALID_ACTOR_TYPE',\n WALLET_NOT_CONNECTED = 'WALLET_NOT_CONNECTED',\n INSUFFICIENT_BALANCE = 'INSUFFICIENT_BALANCE',\n INTENT_REJECTED = 'INTENT_REJECTED',\n INTENT_EXPIRED = 'INTENT_EXPIRED',\n APPROVAL_TIMEOUT = 'APPROVAL_TIMEOUT',\n POLICY_VIOLATION = 'POLICY_VIOLATION',\n BUDGET_EXCEEDED = 'BUDGET_EXCEEDED',\n ACTION_NOT_ALLOWED = 'ACTION_NOT_ALLOWED',\n TARGET_BLOCKED = 'TARGET_BLOCKED',\n COOLDOWN_ACTIVE = 'COOLDOWN_ACTIVE',\n RATE_LIMITED = 'RATE_LIMITED',\n STATE_GATE_FAILED = 'STATE_GATE_FAILED',\n ATTESTATION_REQUIRED = 'ATTESTATION_REQUIRED',\n ESCROW_NOT_FOUND = 'ESCROW_NOT_FOUND',\n ESCROW_WRONG_STATE = 'ESCROW_WRONG_STATE',\n NOT_AUTHORIZED_SIGNER = 'NOT_AUTHORIZED_SIGNER',\n NO_ESCROW_FOR_REVIEW = 'NO_ESCROW_FOR_REVIEW',\n ALREADY_REVIEWED = 'ALREADY_REVIEWED',\n NETWORK_ERROR = 'NETWORK_ERROR',\n TX_REVERTED = 'TX_REVERTED',\n VERIFICATION_FAILED = 'VERIFICATION_FAILED',\n PAYMENT_REQUIRED = 'PAYMENT_REQUIRED',\n PAYMENT_FAILED = 'PAYMENT_FAILED',\n PAYMENT_VERIFICATION_FAILED = 'PAYMENT_VERIFICATION_FAILED',\n ERC8004_NOT_DEPLOYED = 'ERC8004_NOT_DEPLOYED',\n ERC8004_AGENT_NOT_FOUND = 'ERC8004_AGENT_NOT_FOUND',\n NOT_IMPLEMENTED = 'NOT_IMPLEMENTED',\n INVALID_INPUT = 'INVALID_INPUT',\n}\n","/**\n * Template system core types for Invariance Protocol.\n * Templates compose verification rules declaratively for smart contract gating.\n */\n\n// ============================================================================\n// Branded Types\n// ============================================================================\n\ndeclare const TemplateIdBrand: unique symbol;\n/**\n * Branded type for template identifiers.\n */\nexport type TemplateId = string & { readonly [TemplateIdBrand]: typeof TemplateIdBrand };\n\n/**\n * Create a TemplateId from a string (unsafe, no validation).\n */\nexport function createTemplateId(id: string): TemplateId {\n return id as TemplateId;\n}\n\n// ============================================================================\n// Function Definition\n// ============================================================================\n\n/**\n * Defines a function that can be called through the template.\n */\nexport interface FunctionDefinition {\n /** Function selector or name */\n selector: string;\n /** Human-readable function name */\n name: string;\n /** Function signature (e.g., \"transfer(address,uint256)\") */\n signature: string;\n /** Parameter definitions */\n parameters: ParameterDefinition[];\n}\n\n/**\n * Defines a parameter for a function.\n */\nexport interface ParameterDefinition {\n /** Parameter name */\n name: string;\n /** Solidity type (e.g., \"address\", \"uint256\", \"bytes\") */\n type: string;\n /** Whether this parameter is indexed in events */\n indexed?: boolean;\n /** Human-readable description */\n description?: string;\n}\n\n// ============================================================================\n// Verification Rules\n// ============================================================================\n\nimport type { AuthorizationRule } from './authorization.js';\nimport type { ProofRequirement } from './proof-requirements.js';\nimport type { StateCondition } from './conditions.js';\nimport type { TimingRule } from './timing.js';\nimport type { StakingRule } from './staking.js';\nimport type { RateLimitRule } from './rate-limiting.js';\n\n/**\n * Complete set of verification rules for a template.\n */\nexport interface VerificationRules {\n /** Authorization requirements (who can execute) */\n authorization?: AuthorizationRule[];\n /** Proof requirements (what evidence is needed) */\n proofs?: ProofRequirement[];\n /** State conditions (what must be true on-chain) */\n conditions?: StateCondition[];\n /** Timing rules (when execution is allowed) */\n timing?: TimingRule[];\n /** Staking requirements (what must be locked) */\n staking?: StakingRule[];\n /** Rate limiting rules (how often execution is allowed) */\n rateLimits?: RateLimitRule[];\n}\n\n// ============================================================================\n// Execution Configuration\n// ============================================================================\n\nimport type { ExecutionMode, RollbackRule } from './execution.js';\n\n/**\n * Configuration for how actions are executed.\n */\nexport interface ExecutionConfig {\n /** How the action should be executed */\n mode: ExecutionMode;\n /** Rules for rolling back failed executions */\n rollback?: RollbackRule;\n /** Gas limit for execution */\n gasLimit?: bigint;\n /** Priority fee in wei */\n maxPriorityFee?: bigint;\n /** Maximum fee per gas in wei */\n maxFeePerGas?: bigint;\n /** Number of block confirmations required */\n confirmations?: number;\n}\n\n// ============================================================================\n// Monitoring Configuration\n// ============================================================================\n\nimport type { LoggingLevel, ComplianceConfig, TemplateEvent } from './monitoring.js';\n\n/**\n * Configuration for monitoring and logging.\n */\nexport interface MonitoringConfig {\n /** Logging verbosity level */\n loggingLevel: LoggingLevel;\n /** Events to emit during execution */\n events?: TemplateEvent[];\n /** Compliance and audit configuration */\n compliance?: ComplianceConfig;\n /** Whether to store execution proofs on-chain */\n storeProofs?: boolean;\n /** Webhook URL for real-time notifications */\n webhookUrl?: string;\n}\n\n// ============================================================================\n// Template Options\n// ============================================================================\n\n/**\n * Options for creating a template.\n */\nexport interface TemplateOptions {\n /** Unique template identifier */\n templateId: TemplateId;\n /** Human-readable template name */\n name: string;\n /** Template description */\n description?: string;\n /** Template version (semver) */\n version: string;\n /** Whether the template is currently active */\n active: boolean;\n /** Template author/owner address */\n owner?: string;\n /** Tags for categorization */\n tags?: string[];\n}\n\n// ============================================================================\n// Main Template Interface\n// ============================================================================\n\n/**\n * Complete template definition for Invariance Protocol.\n * Templates compose verification rules declaratively.\n */\nexport interface InvarianceTemplate {\n /** Template metadata and options */\n options: TemplateOptions;\n /** Functions this template applies to */\n functions: FunctionDefinition[];\n /** Verification rules to enforce */\n verification: VerificationRules;\n /** Execution configuration */\n execution: ExecutionConfig;\n /** Monitoring and logging configuration */\n monitoring?: MonitoringConfig;\n}\n\n// ============================================================================\n// Template Check Result\n// ============================================================================\n\n/**\n * Detailed result of a template verification check.\n */\nexport interface TemplateCheckResult {\n /** Whether the action is allowed */\n allowed: boolean;\n /** Template that performed the check */\n templateId: TemplateId;\n /** Timestamp of the check */\n timestamp: number;\n /** Results from each verification rule category */\n ruleResults: RuleCheckResults;\n /** Human-readable reason for denial (if not allowed) */\n reason?: string;\n /** Detailed errors from failed checks */\n errors?: TemplateError[];\n /** Warnings that don't block execution */\n warnings?: string[];\n /** Metadata about the check */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Results from each category of verification rules.\n */\nexport interface RuleCheckResults {\n authorization?: RuleResult;\n proofs?: RuleResult;\n conditions?: RuleResult;\n timing?: RuleResult;\n staking?: RuleResult;\n rateLimits?: RuleResult;\n}\n\n/**\n * Result of checking a single rule category.\n */\nexport interface RuleResult {\n /** Whether all rules in this category passed */\n passed: boolean;\n /** Number of rules checked */\n rulesChecked: number;\n /** Number of rules that passed */\n rulesPassed: number;\n /** Details about individual rule checks */\n details?: RuleDetail[];\n}\n\n/**\n * Detail about a single rule check.\n */\nexport interface RuleDetail {\n /** Rule type identifier */\n ruleType: string;\n /** Whether this rule passed */\n passed: boolean;\n /** Human-readable message */\n message?: string;\n /** Additional data about the check */\n data?: Record<string, unknown>;\n}\n\n/**\n * Error from a failed template check.\n */\nexport interface TemplateError {\n /** Error code */\n code: string;\n /** Human-readable error message */\n message: string;\n /** Rule that caused the error */\n rule?: string;\n /** Additional error context */\n context?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Verification Context\n// ============================================================================\n\n/**\n * Context provided to template verification.\n */\nexport interface VerificationContext {\n /** Address initiating the action */\n sender: string;\n /** Current block number */\n blockNumber: number;\n /** Current block timestamp */\n timestamp: number;\n /** Chain ID */\n chainId?: number;\n /** Transaction value in wei */\n value?: bigint;\n /** Gas price in wei */\n gasPrice?: bigint;\n /** Nonce for the transaction */\n nonce?: number;\n /** Additional context data */\n data?: Record<string, unknown>;\n}\n","/**\n * Custom Permission Marketplace Types\n *\n * Types for the custom permission marketplace, enabling users to write,\n * deploy, and share custom Solidity verification logic.\n */\n\n// ============================================================================\n// Branded Types\n// ============================================================================\n\ndeclare const CustomPermissionIdBrand: unique symbol;\n\n/**\n * Branded type for custom permission IDs.\n * Used to identify permissions in the marketplace registry.\n */\nexport type CustomPermissionId = string & {\n readonly [CustomPermissionIdBrand]: typeof CustomPermissionIdBrand;\n};\n\n/**\n * Create a CustomPermissionId from a string or number.\n *\n * @param id - The permission ID (typically a number from the contract)\n * @returns A branded CustomPermissionId\n */\nexport function createCustomPermissionId(id: string | number): CustomPermissionId {\n return String(id) as CustomPermissionId;\n}\n\n// ============================================================================\n// Metadata Types\n// ============================================================================\n\n/**\n * Metadata describing a custom permission in the marketplace.\n */\nexport interface CustomPermissionMetadata {\n /** Unique permission identifier */\n permissionId: CustomPermissionId;\n /** Address of the deployed permission contract */\n contractAddress: string;\n /** Human-readable name */\n name: string;\n /** Detailed description of what this permission checks */\n description: string;\n /** Semantic version string (e.g., \"1.0.0\") */\n version: string;\n /** Address of the permission creator */\n author: string;\n /** Categorization tags for discovery */\n tags: string[];\n /** Keccak256 hash of the contract bytecode */\n codeHash: string;\n /** Unix timestamp when registered */\n registrationTime: number;\n /** Number of agents currently using this permission */\n usageCount: number;\n /** Whether the permission has been audited/verified */\n verified: boolean;\n /** Whether the permission is available for use */\n active: boolean;\n}\n\n/**\n * Configuration for enabling a custom permission for an agent.\n */\nexport interface CustomPermissionConfig {\n /** The permission to enable */\n permissionId: CustomPermissionId;\n /**\n * Maximum gas allowed for checkPermission call.\n * Default: 100,000 gas\n * Range: 10,000 - 500,000 gas\n */\n gasBudget?: bigint;\n}\n\n/**\n * Agent-specific permission configuration (returned from contract).\n */\nexport interface AgentPermissionConfig {\n /** Maximum gas allowed for checkPermission call */\n gasBudget: bigint;\n /** Unix timestamp when the permission was enabled */\n enabledAt: number;\n /** Whether the permission is currently active for this agent */\n active: boolean;\n}\n\n// ============================================================================\n// Query Types\n// ============================================================================\n\n/**\n * Options for listing permissions in the marketplace.\n */\nexport interface ListPermissionsOptions {\n /** Filter by tag */\n tag?: string;\n /** Filter by author address */\n author?: string;\n /** Only show verified permissions */\n verifiedOnly?: boolean;\n /** Only show active permissions */\n activeOnly?: boolean;\n /** Maximum number of results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n /** Sort field */\n sortBy?: 'registrationTime' | 'usageCount' | 'name';\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Result of a permission check.\n */\nexport interface CustomPermissionCheckResult {\n /** Whether the action is allowed */\n allowed: boolean;\n /** The permission that denied the action (if any) */\n deniedByPermissionId?: CustomPermissionId;\n /** Human-readable reason for denial */\n reason?: string;\n}\n\n// ============================================================================\n// Deployment Types\n// ============================================================================\n\n/**\n * Options for deploying a custom permission.\n */\nexport interface DeployPermissionOptions {\n /** Human-readable name */\n name: string;\n /** Detailed description */\n description: string;\n /** Version string */\n version: string;\n /** Categorization tags */\n tags: string[];\n /** Compiled contract bytecode (0x prefixed hex string) */\n bytecode: string;\n /** Constructor arguments (ABI encoded) */\n constructorArgs?: string;\n}\n\n/**\n * Result of deploying a custom permission.\n */\nexport interface DeployPermissionResult {\n /** The assigned permission ID */\n permissionId: CustomPermissionId;\n /** Address of the deployed contract */\n contractAddress: string;\n /** Transaction hash of the deployment */\n txHash: string;\n /** Block number where the contract was deployed */\n blockNumber: number;\n}\n\n/**\n * Options for deploying from a template.\n */\nexport interface DeployFromTemplateOptions {\n /** Name of the template to use */\n templateName: string;\n /** Template-specific configuration */\n config: Record<string, unknown>;\n /** Human-readable name for the deployed permission */\n name?: string;\n /** Description override */\n description?: string;\n /** Categorization tags */\n tags?: string[];\n}\n\n// ============================================================================\n// Built-in Template Types\n// ============================================================================\n\n/**\n * Available built-in permission templates.\n */\nexport type BuiltInTemplateType =\n | 'max-daily-spend'\n | 'address-whitelist'\n | 'address-blacklist'\n | 'time-restricted'\n | 'action-type-filter'\n | 'value-threshold'\n | 'rate-limiter'\n | 'cooldown-enforcer';\n\n/**\n * Configuration for the max-daily-spend template.\n */\nexport interface MaxDailySpendConfig {\n /** Maximum amount per day (in wei) */\n maxDaily: bigint;\n /** Token address (address(0) for native ETH) */\n token?: string;\n}\n\n/**\n * Configuration for the address-whitelist template.\n */\nexport interface AddressWhitelistConfig {\n /** Whitelisted addresses */\n addresses: string[];\n /** Whether to check recipient or sender */\n checkField: 'recipient' | 'sender' | 'both';\n}\n\n/**\n * Configuration for the address-blacklist template.\n */\nexport interface AddressBlacklistConfig {\n /** Blacklisted addresses */\n addresses: string[];\n /** Whether to check recipient or sender */\n checkField: 'recipient' | 'sender' | 'both';\n}\n\n/**\n * Configuration for the time-restricted template.\n */\nexport interface TimeRestrictedConfig {\n /** Start hour (0-23, UTC) */\n startHour: number;\n /** End hour (0-23, UTC) */\n endHour: number;\n /** Allowed days (0 = Sunday, 6 = Saturday) */\n allowedDays?: number[];\n}\n\n/**\n * Configuration for the action-type-filter template.\n */\nexport interface ActionTypeFilterConfig {\n /** Allowed action type patterns */\n allowedPatterns: string[];\n /** Whether to use blocklist instead of allowlist */\n isBlocklist?: boolean;\n}\n\n/**\n * Configuration for the value-threshold template.\n */\nexport interface ValueThresholdConfig {\n /** Maximum value per transaction (in wei) */\n maxValue: bigint;\n /** Token address (address(0) for native ETH) */\n token?: string;\n}\n\n/**\n * Configuration for the rate-limiter template.\n */\nexport interface RateLimiterConfig {\n /** Maximum number of actions */\n maxActions: number;\n /** Time window in seconds */\n windowSeconds: number;\n /** Whether to track per action type */\n perActionType?: boolean;\n}\n\n/**\n * Configuration for the cooldown-enforcer template.\n */\nexport interface CooldownEnforcerConfig {\n /** Cooldown period in seconds */\n cooldownSeconds: number;\n /** Action types this applies to (empty = all) */\n actionTypes?: string[];\n}\n\n/**\n * Union type of all template configurations.\n */\nexport type TemplateConfig =\n | MaxDailySpendConfig\n | AddressWhitelistConfig\n | AddressBlacklistConfig\n | TimeRestrictedConfig\n | ActionTypeFilterConfig\n | ValueThresholdConfig\n | RateLimiterConfig\n | CooldownEnforcerConfig;\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\n/**\n * Event emitted when a permission is registered.\n */\nexport interface PermissionRegisteredEvent {\n type: 'permission-registered';\n permissionId: CustomPermissionId;\n contractAddress: string;\n author: string;\n name: string;\n blockNumber: number;\n txHash: string;\n timestamp: number;\n}\n\n/**\n * Event emitted when a permission version is updated.\n */\nexport interface PermissionVersionUpdatedEvent {\n type: 'permission-version-updated';\n permissionId: CustomPermissionId;\n oldContract: string;\n newContract: string;\n version: string;\n blockNumber: number;\n txHash: string;\n timestamp: number;\n}\n\n/**\n * Event emitted when an agent enables a permission.\n */\nexport interface PermissionEnabledEvent {\n type: 'permission-enabled';\n agent: string;\n permissionId: CustomPermissionId;\n gasBudget: bigint;\n blockNumber: number;\n txHash: string;\n timestamp: number;\n}\n\n/**\n * Event emitted when an agent disables a permission.\n */\nexport interface PermissionDisabledEvent {\n type: 'permission-disabled';\n agent: string;\n permissionId: CustomPermissionId;\n blockNumber: number;\n txHash: string;\n timestamp: number;\n}\n\n/**\n * Union type of all marketplace events.\n */\nexport type MarketplaceEvent =\n | PermissionRegisteredEvent\n | PermissionVersionUpdatedEvent\n | PermissionEnabledEvent\n | PermissionDisabledEvent;\n","/**\n * Supported chain configurations.\n */\nexport interface ChainConfig {\n /** Chain ID */\n id: number;\n /** Chain name */\n name: string;\n /** RPC URL */\n rpcUrl: string;\n /** Block explorer URL */\n explorerUrl: string;\n /** Whether this is a testnet */\n testnet: boolean;\n /** Default polling interval in ms (matches block time). Base L2 = 2s. */\n pollingInterval: number;\n}\n\n/**\n * Base mainnet configuration.\n */\n/**\n * Base mainnet configuration.\n *\n * For production, use a dedicated RPC provider (Alchemy, QuickNode, etc.)\n * via `rpcUrl` in InvarianceConfig for faster and more reliable responses.\n */\nexport const BASE_MAINNET: ChainConfig = {\n id: 8453,\n name: 'Base',\n rpcUrl: 'https://mainnet.base.org',\n explorerUrl: 'https://basescan.org',\n testnet: false,\n pollingInterval: 2_000,\n};\n\n/**\n * Base Sepolia testnet configuration.\n */\n/**\n * Base Sepolia testnet configuration.\n *\n * For production, use a dedicated RPC provider (Alchemy, QuickNode, etc.)\n * via `rpcUrl` in InvarianceConfig for faster and more reliable responses.\n */\nexport const BASE_SEPOLIA: ChainConfig = {\n id: 84532,\n name: 'Base Sepolia',\n rpcUrl: 'https://sepolia.base.org',\n explorerUrl: 'https://sepolia.basescan.org',\n testnet: true,\n pollingInterval: 2_000,\n};\n\n/**\n * All supported chains.\n */\nexport const SUPPORTED_CHAINS: Record<number, ChainConfig> = {\n [BASE_MAINNET.id]: BASE_MAINNET,\n [BASE_SEPOLIA.id]: BASE_SEPOLIA,\n};\n\n/**\n * Get chain config by ID.\n */\nexport function getChainConfig(chainId: number): ChainConfig | undefined {\n return SUPPORTED_CHAINS[chainId];\n}\n\n/**\n * Check if a chain is supported.\n */\nexport function isSupportedChain(chainId: number): boolean {\n return chainId in SUPPORTED_CHAINS;\n}\n","/**\n * Contract addresses for each supported chain.\n */\nexport interface ContractAddresses {\n /** InvarianceIdentity contract address */\n identity: string;\n /** InvarianceIntent contract address */\n intent: string;\n /** InvariancePolicy contract address */\n policy: string;\n /** InvarianceEscrow contract address */\n escrow: string;\n /** InvarianceLedger contract address */\n ledger: string;\n /** InvarianceReview contract address */\n review: string;\n /** InvarianceRegistry contract address */\n registry: string;\n /** InvarianceHire contract address (optional, used for marketplace hires) */\n hire?: string;\n /** USDC token contract address (optional, used for escrow/payments) */\n usdc?: string;\n /** InvarianceCompactLedger contract address (optional, gas-optimized ledger) */\n compactLedger?: string;\n /** InvarianceAtomicVerifier contract address (optional, single-tx verification) */\n atomicVerifier?: string;\n /** InvarianceVoting contract address (optional, off-chain batch voting) */\n voting?: string;\n}\n\n/** Contract addresses on Base mainnet. TODO: Update with deployed addresses */\nexport const BASE_MAINNET_CONTRACTS: ContractAddresses = {\n identity: '0x0000000000000000000000000000000000000000',\n intent: '0x0000000000000000000000000000000000000000',\n policy: '0x0000000000000000000000000000000000000000',\n escrow: '0x0000000000000000000000000000000000000000',\n ledger: '0x0000000000000000000000000000000000000000',\n review: '0x0000000000000000000000000000000000000000',\n registry: '0x0000000000000000000000000000000000000000',\n};\n\n/** Contract addresses on Base Sepolia testnet */\nexport const BASE_SEPOLIA_CONTRACTS: ContractAddresses = {\n identity: '0x98082761AC9ef71f5D2FD0D81Fa68DDe0a5f549d',\n intent: '0xBd6f5e95C18Bb7E913d56fdFa7a9e9b726Cf5F1D',\n policy: '0x476b03fa71f65D34AE95Cbd5E8c6833Fe5a0b7d9',\n escrow: '0x72E55D252385E761C1DEf0b705D3a6e7b341bbF6',\n ledger: '0xf9eeCe4534e43B8683d035D847EB80cf1d2591Bf',\n review: '0xB8A7246CAA56764c4b6ef18dc72379Cfc03505D3',\n registry: '0xd5Ea9F94B51B8aDb441d74450066173863509043',\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n};\n\n/** Contract addresses by chain ID */\nexport const CONTRACT_ADDRESSES: Record<number, ContractAddresses> = {\n 8453: BASE_MAINNET_CONTRACTS,\n 84532: BASE_SEPOLIA_CONTRACTS,\n};\n\n/**\n * Platform signer address for verifying attestation signatures.\n * This is the public address corresponding to the PLATFORM_SIGNING_KEY used by the backend.\n * Anyone can use this to verify that a platform attestation was genuinely signed by Invariance.\n *\n * TODO: Replace with actual deployed signer address before mainnet launch.\n * WARNING: This is a placeholder — do not use for production signature verification.\n */\nexport const PLATFORM_SIGNER_ADDRESS = '0x1234000000000000000000000000000000000000' as const;\n\n/** Zero address constant */\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\n/**\n * Validate that a platform signer address is not a placeholder or zero address.\n * Call this before trusting attestation verification results.\n */\nexport function validatePlatformSigner(address: string): void {\n if (address === ZERO_ADDRESS) {\n throw new Error('Platform signer address is the zero address');\n }\n if (address === PLATFORM_SIGNER_ADDRESS) {\n throw new Error('Platform signer address is still a placeholder. Set the real signer address before production use.');\n }\n}\n\n/** Get contract addresses for a chain */\nexport function getContractAddresses(chainId: number): ContractAddresses | undefined {\n return CONTRACT_ADDRESSES[chainId];\n}\n","import type { ActorType } from '../types/actions.js';\nimport type { ActionCategory } from '../types/policies.js';\n\n/**\n * Maximum uint256 value for unlimited maxValue.\n */\nexport const MAX_UINT256 = BigInt(\n '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'\n);\n\n/**\n * Default values for policy fields.\n * These are applied when creating policies without specifying all fields.\n */\nexport const DEFAULT_POLICY_VALUES = {\n /** Default policy version */\n version: '1.0.0',\n\n /** Default max gas per action (5 million gas) */\n maxGas: 5_000_000n,\n\n /** Default max value - unlimited */\n maxValue: MAX_UINT256,\n\n /** Default allowed actors - any actor type */\n allowedActors: ['any'] as ActorType[],\n\n /** Default cooldown between same-category actions (5 minutes) */\n cooldownSeconds: 300,\n\n /** Default action category */\n category: 'CUSTOM' as ActionCategory,\n} as const;\n\n/**\n * Apply default policy values to a partial policy configuration.\n *\n * @param partial - Partial policy configuration\n * @returns Complete policy configuration with defaults applied\n */\nexport function applyPolicyDefaults<T extends Partial<typeof DEFAULT_POLICY_VALUES>>(\n partial: T\n): T & typeof DEFAULT_POLICY_VALUES {\n return {\n ...DEFAULT_POLICY_VALUES,\n ...partial,\n };\n}\n","import { ErrorCode } from '@invariance/common';\n\n/**\n * Base error class for all Invariance SDK errors.\n *\n * Every SDK error carries a structured {@link ErrorCode} for programmatic handling,\n * along with optional explorer URL and transaction hash for on-chain debugging.\n *\n * @example\n * ```typescript\n * try {\n * await inv.intent.request(opts);\n * } catch (err) {\n * if (err instanceof InvarianceError) {\n * console.error(err.code, err.message, err.explorerUrl);\n * }\n * }\n * ```\n */\nexport class InvarianceError extends Error {\n /** Structured error code for programmatic handling */\n public readonly code: ErrorCode;\n\n /** Public explorer URL relevant to the error context */\n public readonly explorerUrl?: string | undefined;\n\n /** On-chain transaction hash related to the error */\n public readonly txHash?: string | undefined;\n\n constructor(\n code: ErrorCode,\n message: string,\n opts?: { explorerUrl?: string; txHash?: string },\n ) {\n super(message);\n this.name = 'InvarianceError';\n this.code = code;\n this.explorerUrl = opts?.explorerUrl;\n this.txHash = opts?.txHash;\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, InvarianceError);\n }\n }\n}\n"],"mappings":"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","names":["ErrorCode","mapped"]}
@@ -32,7 +32,7 @@ import {
32
32
  pricingTypeToEnum,
33
33
  toBytes32,
34
34
  waitForReceipt
35
- } from "./chunk-3ONNY6AX.js";
35
+ } from "./chunk-2JGPNHE3.js";
36
36
  import "./chunk-GHYGRZHM.js";
37
37
  import "./chunk-VUNV25KB.js";
38
38
  export {
@@ -70,4 +70,4 @@ export {
70
70
  toBytes32,
71
71
  waitForReceipt
72
72
  };
73
- //# sourceMappingURL=contract-helpers-XI4NOQLS.js.map
73
+ //# sourceMappingURL=contract-helpers-2XZGNKCO.js.map
package/dist/index.cjs CHANGED
@@ -8868,6 +8868,7 @@ __export(index_exports, {
8868
8868
  SocialGraphAdapter: () => SocialGraphAdapter,
8869
8869
  Telemetry: () => Telemetry,
8870
8870
  Verifier: () => Verifier,
8871
+ VotingManager: () => VotingManager,
8871
8872
  WalletManager: () => WalletManager,
8872
8873
  X402Manager: () => X402Manager,
8873
8874
  generatePrivateKey: () => import_accounts3.generatePrivateKey,
@@ -8904,6 +8905,7 @@ var ABI_MAP = {
8904
8905
  atomicVerifier: InvarianceAtomicVerifierAbi,
8905
8906
  voting: InvarianceVotingAbi
8906
8907
  };
8908
+ var ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
8907
8909
  var ADDRESS_KEY_MAP = {
8908
8910
  identity: "identity",
8909
8911
  policy: "policy",
@@ -8997,6 +8999,12 @@ var ContractFactory = class {
8997
8999
  `Contract address not configured: ${name}`
8998
9000
  );
8999
9001
  }
9002
+ if (addr === ZERO_ADDRESS) {
9003
+ throw new InvarianceError(
9004
+ ErrorCode.NETWORK_ERROR,
9005
+ `Contract address for ${name} is the zero address. Contracts may not be deployed on this chain yet.`
9006
+ );
9007
+ }
9000
9008
  return addr;
9001
9009
  }
9002
9010
  /**
@@ -17064,7 +17072,7 @@ var VotingManager = class {
17064
17072
  };
17065
17073
 
17066
17074
  // src/core/InvarianceClient.ts
17067
- var SDK_VERSION = "0.0.1";
17075
+ var SDK_VERSION = "0.1.0";
17068
17076
  var Invariance = class _Invariance {
17069
17077
  config;
17070
17078
  contracts;
@@ -19016,6 +19024,7 @@ var import_accounts3 = require("viem/accounts");
19016
19024
  SocialGraphAdapter,
19017
19025
  Telemetry,
19018
19026
  Verifier,
19027
+ VotingManager,
19019
19028
  WalletManager,
19020
19029
  X402Manager,
19021
19030
  generatePrivateKey,