import type { Client } from '../clients/types.mjs'; import type { Address } from '../types/primitives.mjs'; export type InterfaceAbi = ReadonlyArray> | string | readonly string[]; export type ReadCallOptions = { /** view 호출의 주체 account. 기본값은 client.account?.address (있으면) 또는 컨트랙트 주소. */ caller?: Address; amount?: string; fuelLimit?: string; }; export type GetContractArgs = { address: Address; abi: InterfaceAbi; client: Client; /** * 컨트랙트(=subId)가 속한 VME id. 신규 VME 모델의 debug_viewVme 가 컨트랙트를 * 찾으려면 반드시 필요하다 (필수). 컨트랙트는 하나의 VME 에 속하므로 핸들의 * 불변 속성 — read 호출마다 받지 않고 생성 시 1회 지정한다. */ vmeId: string; }; export type ContractReadFn = (args?: readonly unknown[], opts?: ReadCallOptions) => Promise; export type ContractInstance = { address: Address; abi: InterfaceAbi; read: Record; }; /** * Locus 의 debug_viewVme RPC 위에 viem 스타일 컨트랙트 핸들을 만든다. * `read.` 은 ethers(v5) 의 Interface 로 호출을 인코딩하고, 결과 바이트를 * convertHexToData 로 Locus `callData` 필드에 담아 보낸 뒤, 응답 hex 를 * Interface.decodeFunctionResult 로 다시 디코딩한다. * * 신규 VME 모델: 컨트랙트는 (vmeId, subId) 로 식별된다. `address` 가 subId 이고 * `vmeId` 는 read 호출 시 ReadCallOptions 로 받는다 (필수). RPC ParamsCallVme 의 * vmeId/subId 와 1:1 대응. * * write 메서드는 이번 단계에서는 의도적으로 빠져 있다. 상태를 바꾸는 호출 * 은 생성된 wallet action 을 직접 사용한다: * * import { callVme } from '@locuschain/lib/autogen'; * await wallet.extend(debugWalletActions).callVme({ ... }); */ export declare function getContract(args: GetContractArgs): ContractInstance;