import { type Address, type Hex } from "viem"; import type { LucidlyClient } from "./client.js"; /** * LucidlyRegistry — chain-singleton (Arachnid CREATE2 → same address on every chain) source of truth * for v2.3 (current live): which protocols + components are audited, which policy templates * strategists may self-enable, and which assets can be a vault's base. The factory + PolicyManagers * only READ it. The registry address changed at the v2.3 cut (was 0xE604…7FB8 in v2.1/v2.2, now * 0xA621…F5be) so it had to be reseeded — currently Base + Ethereum carry the syUSD starter pack. * * This module covers the READ surface + the deterministic id helpers (so the SDK can compute the * exact `templateId` / `protocolId` / `argsHash` the on-chain registry would compute). Admin writes * (registerProtocol / addPolicyTemplate / setApprovedBaseAsset) are deliberately not surfaced — they * run from `forge script` with the registry-owner key, not from a general client. */ export declare const REGISTRY_V2_ADDRESS: Address; /** Sentinel returned by `registry.NO_VAULT_ARG()` — also matches Solidity `type(uint16).max`. */ export declare const NO_VAULT_ARG = 65535; export declare enum PolicyStatus { Unknown = 0, Whitelisted = 1, Deprecated = 2 } export interface ProtocolEntry { /** Shared decoder/sanitizer address (used directly in leaves). */ decoder: Address; /** Per-vault TVL adapter implementation (0 = none yet). */ tvlAdapterImpl: Address; /** Per-vault oracle implementation (0 = none yet). */ oracleImpl: Address; active: boolean; } export interface PolicyTemplate { protocolId: Hex; target: Address; selector: Hex; valueIsNonZero: boolean; /** VAULT-BOUND offset, or NO_VAULT_ARG (65535) for FIXED-ARGS mode. */ vaultArgOffset: number; /** FIXED-ARGS: required keccak256(packedArgs); ignored in VAULT-BOUND. */ argsHash: Hex; status: PolicyStatus; } export declare const REGISTRY_V2_ABI: readonly [{ readonly type: "function"; readonly name: "templates"; readonly stateMutability: "view"; readonly inputs: readonly [{ readonly name: "templateId"; readonly type: "bytes32"; }]; readonly outputs: readonly [{ readonly name: "protocolId"; readonly type: "bytes32"; }, { readonly name: "target"; readonly type: "address"; }, { readonly name: "selector"; readonly type: "bytes4"; }, { readonly name: "valueIsNonZero"; readonly type: "bool"; }, { readonly name: "vaultArgOffset"; readonly type: "uint16"; }, { readonly name: "argsHash"; readonly type: "bytes32"; }, { readonly name: "status"; readonly type: "uint8"; }]; }, { readonly type: "function"; readonly name: "protocols"; readonly stateMutability: "view"; readonly inputs: readonly [{ readonly name: "protocolId"; readonly type: "bytes32"; }]; readonly outputs: readonly [{ readonly name: "decoder"; readonly type: "address"; }, { readonly name: "tvlAdapterImpl"; readonly type: "address"; }, { readonly name: "oracleImpl"; readonly type: "address"; }, { readonly name: "active"; readonly type: "bool"; }]; }, { readonly type: "function"; readonly name: "decoderFor"; readonly stateMutability: "view"; readonly inputs: readonly [{ readonly name: "protocolId"; readonly type: "bytes32"; }]; readonly outputs: readonly [{ readonly type: "address"; }]; }, { readonly type: "function"; readonly name: "componentImplsFor"; readonly stateMutability: "view"; readonly inputs: readonly [{ readonly name: "protocolId"; readonly type: "bytes32"; }]; readonly outputs: readonly [{ readonly name: "decoder"; readonly type: "address"; }, { readonly name: "tvlAdapterImpl"; readonly type: "address"; }, { readonly name: "oracleImpl"; readonly type: "address"; }]; }, { readonly type: "function"; readonly name: "isWhitelisted"; readonly stateMutability: "view"; readonly inputs: readonly [{ readonly name: "templateId"; readonly type: "bytes32"; }]; readonly outputs: readonly [{ readonly type: "bool"; }]; }, { readonly type: "function"; readonly name: "approvedBaseAssets"; readonly stateMutability: "view"; readonly inputs: readonly [{ readonly name: "asset"; readonly type: "address"; }]; readonly outputs: readonly [{ readonly type: "bool"; }]; }, { readonly type: "function"; readonly name: "computeTemplateId"; readonly stateMutability: "pure"; readonly inputs: readonly [{ readonly name: "protocolId"; readonly type: "bytes32"; }, { readonly name: "target"; readonly type: "address"; }, { readonly name: "selector"; readonly type: "bytes4"; }, { readonly name: "valueIsNonZero"; readonly type: "bool"; }, { readonly name: "vaultArgOffset"; readonly type: "uint16"; }, { readonly name: "argsHash"; readonly type: "bytes32"; }]; readonly outputs: readonly [{ readonly type: "bytes32"; }]; }]; /** Solidity keccak256("name") — used for `protocolId`. */ export declare function protocolIdOf(name: string): Hex; /** keccak256 of a hex blob — used for `argsHash = keccak256(packedArgs)`. */ export declare function argsHashOf(packedArgsHex: Hex): Hex; /** * Deterministic templateId derivation matching `LucidlyRegistry.computeTemplateId`: * keccak256(abi.encode(protocolId, target, selector, valueIsNonZero, vaultArgOffset, argsHash)). */ export declare function computeTemplateId(input: { protocolId: Hex; target: Address; selector: Hex; valueIsNonZero: boolean; vaultArgOffset: number; argsHash: Hex; }): Hex; export declare class RegistryModule { private readonly client; /** Chain-invariant registry address. Override with `setAddress()` for a non-standard deployment. */ private addr; constructor(client: LucidlyClient); address(): Address; setAddress(a: Address): void; protocolId: typeof protocolIdOf; argsHash: typeof argsHashOf; templateId: typeof computeTemplateId; template(templateId: Hex): Promise; protocol(protocolId: Hex): Promise; decoderFor(protocolId: Hex): Promise
; isWhitelisted(templateId: Hex): Promise; isApprovedBaseAsset(asset: Address): Promise; }