import {z} from 'zod' export type GetApiEvmosEvmV1TraceTxArgs = {'msg.data.typeUrl'?: string | undefined, 'msg.data.value'?: string | undefined, 'msg.size'?: number | undefined, 'msg.hash'?: string | undefined, 'msg.from'?: string | undefined, 'traceConfig.tracer'?: string | undefined, 'traceConfig.timeout'?: string | undefined, 'traceConfig.reexec'?: unknown | undefined, 'traceConfig.disableStack'?: boolean | undefined, 'traceConfig.disableStorage'?: boolean | undefined, 'traceConfig.debug'?: boolean | undefined, 'traceConfig.limit'?: number | undefined, 'traceConfig.overrides.homesteadBlock'?: string | undefined, 'traceConfig.overrides.daoForkBlock'?: string | undefined, 'traceConfig.overrides.daoForkSupport'?: boolean | undefined, 'traceConfig.overrides.eip150Block'?: string | undefined, 'traceConfig.overrides.eip150Hash'?: string | undefined, 'traceConfig.overrides.eip155Block'?: string | undefined, 'traceConfig.overrides.eip158Block'?: string | undefined, 'traceConfig.overrides.byzantiumBlock'?: string | undefined, 'traceConfig.overrides.constantinopleBlock'?: string | undefined, 'traceConfig.overrides.petersburgBlock'?: string | undefined, 'traceConfig.overrides.istanbulBlock'?: string | undefined, 'traceConfig.overrides.muirGlacierBlock'?: string | undefined, 'traceConfig.overrides.berlinBlock'?: string | undefined, 'traceConfig.overrides.londonBlock'?: string | undefined, 'traceConfig.overrides.arrowGlacierBlock'?: string | undefined, 'traceConfig.overrides.grayGlacierBlock'?: string | undefined, 'traceConfig.overrides.mergeNetsplitBlock'?: string | undefined, 'traceConfig.overrides.shanghaiBlock'?: string | undefined, 'traceConfig.overrides.cancunBlock'?: string | undefined, 'traceConfig.enableMemory'?: boolean | undefined, 'traceConfig.enableReturnData'?: boolean | undefined, 'traceConfig.tracerJsonConfig'?: string | undefined, blockNumber?: unknown | undefined, blockHash?: string | undefined, blockTime?: string | undefined, proposerAddress?: string | undefined, chainId?: unknown | undefined, blockMaxGas?: unknown | undefined}; export type GetApiEvmosEvmV1TraceTxOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const ethermintEvmV1QueryTraceTxResponse = z.object({data: z.string().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * TraceTx implements the `debug_traceTransaction` rpc api * * GET /evmos/evm/v1/trace_tx */ export const getApiEvmosEvmV1TraceTx = async (args: GetApiEvmosEvmV1TraceTxArgs, options: GetApiEvmosEvmV1TraceTxOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args['msg.data.typeUrl'] != null) query.append("msg.data.typeUrl", String(args['msg.data.typeUrl'])) if (args['msg.data.value'] != null) query.append("msg.data.value", String(args['msg.data.value'])) if (args['msg.size'] != null) query.append("msg.size", String(args['msg.size'])) if (args['msg.hash'] != null) query.append("msg.hash", String(args['msg.hash'])) if (args['msg.from'] != null) query.append("msg.from", String(args['msg.from'])) if (args['traceConfig.tracer'] != null) query.append("traceConfig.tracer", String(args['traceConfig.tracer'])) if (args['traceConfig.timeout'] != null) query.append("traceConfig.timeout", String(args['traceConfig.timeout'])) if (args['traceConfig.reexec'] != null) query.append("traceConfig.reexec", String(args['traceConfig.reexec'])) if (args['traceConfig.disableStack'] != null) query.append("traceConfig.disableStack", String(args['traceConfig.disableStack'])) if (args['traceConfig.disableStorage'] != null) query.append("traceConfig.disableStorage", String(args['traceConfig.disableStorage'])) if (args['traceConfig.debug'] != null) query.append("traceConfig.debug", String(args['traceConfig.debug'])) if (args['traceConfig.limit'] != null) query.append("traceConfig.limit", String(args['traceConfig.limit'])) if (args['traceConfig.overrides.homesteadBlock'] != null) query.append("traceConfig.overrides.homesteadBlock", String(args['traceConfig.overrides.homesteadBlock'])) if (args['traceConfig.overrides.daoForkBlock'] != null) query.append("traceConfig.overrides.daoForkBlock", String(args['traceConfig.overrides.daoForkBlock'])) if (args['traceConfig.overrides.daoForkSupport'] != null) query.append("traceConfig.overrides.daoForkSupport", String(args['traceConfig.overrides.daoForkSupport'])) if (args['traceConfig.overrides.eip150Block'] != null) query.append("traceConfig.overrides.eip150Block", String(args['traceConfig.overrides.eip150Block'])) if (args['traceConfig.overrides.eip150Hash'] != null) query.append("traceConfig.overrides.eip150Hash", String(args['traceConfig.overrides.eip150Hash'])) if (args['traceConfig.overrides.eip155Block'] != null) query.append("traceConfig.overrides.eip155Block", String(args['traceConfig.overrides.eip155Block'])) if (args['traceConfig.overrides.eip158Block'] != null) query.append("traceConfig.overrides.eip158Block", String(args['traceConfig.overrides.eip158Block'])) if (args['traceConfig.overrides.byzantiumBlock'] != null) query.append("traceConfig.overrides.byzantiumBlock", String(args['traceConfig.overrides.byzantiumBlock'])) if (args['traceConfig.overrides.constantinopleBlock'] != null) query.append("traceConfig.overrides.constantinopleBlock", String(args['traceConfig.overrides.constantinopleBlock'])) if (args['traceConfig.overrides.petersburgBlock'] != null) query.append("traceConfig.overrides.petersburgBlock", String(args['traceConfig.overrides.petersburgBlock'])) if (args['traceConfig.overrides.istanbulBlock'] != null) query.append("traceConfig.overrides.istanbulBlock", String(args['traceConfig.overrides.istanbulBlock'])) if (args['traceConfig.overrides.muirGlacierBlock'] != null) query.append("traceConfig.overrides.muirGlacierBlock", String(args['traceConfig.overrides.muirGlacierBlock'])) if (args['traceConfig.overrides.berlinBlock'] != null) query.append("traceConfig.overrides.berlinBlock", String(args['traceConfig.overrides.berlinBlock'])) if (args['traceConfig.overrides.londonBlock'] != null) query.append("traceConfig.overrides.londonBlock", String(args['traceConfig.overrides.londonBlock'])) if (args['traceConfig.overrides.arrowGlacierBlock'] != null) query.append("traceConfig.overrides.arrowGlacierBlock", String(args['traceConfig.overrides.arrowGlacierBlock'])) if (args['traceConfig.overrides.grayGlacierBlock'] != null) query.append("traceConfig.overrides.grayGlacierBlock", String(args['traceConfig.overrides.grayGlacierBlock'])) if (args['traceConfig.overrides.mergeNetsplitBlock'] != null) query.append("traceConfig.overrides.mergeNetsplitBlock", String(args['traceConfig.overrides.mergeNetsplitBlock'])) if (args['traceConfig.overrides.shanghaiBlock'] != null) query.append("traceConfig.overrides.shanghaiBlock", String(args['traceConfig.overrides.shanghaiBlock'])) if (args['traceConfig.overrides.cancunBlock'] != null) query.append("traceConfig.overrides.cancunBlock", String(args['traceConfig.overrides.cancunBlock'])) if (args['traceConfig.enableMemory'] != null) query.append("traceConfig.enableMemory", String(args['traceConfig.enableMemory'])) if (args['traceConfig.enableReturnData'] != null) query.append("traceConfig.enableReturnData", String(args['traceConfig.enableReturnData'])) if (args['traceConfig.tracerJsonConfig'] != null) query.append("traceConfig.tracerJsonConfig", String(args['traceConfig.tracerJsonConfig'])) if (args.blockNumber != null) query.append("blockNumber", String(args.blockNumber)) if (args.blockHash != null) query.append("blockHash", String(args.blockHash)) if (args.blockTime != null) query.append("blockTime", String(args.blockTime)) if (args.proposerAddress != null) query.append("proposerAddress", String(args.proposerAddress)) if (args.chainId != null) query.append("chainId", String(args.chainId)) if (args.blockMaxGas != null) query.append("blockMaxGas", String(args.blockMaxGas)) const url = `${baseUrl.replace(/\/+$/, '')}/evmos/evm/v1/trace_tx${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(ethermintEvmV1QueryTraceTxResponse, await res.json()) };