import { type CcipRequestParameters, type Chain, type DecodeFunctionDataErrorType, decodeFunctionData, type EncodeFunctionResultErrorType, encodeFunctionResult, type GetChainContractAddressErrorType, type IsAddressEqualErrorType, isAddressEqual, parseAbi, type CcipRequestErrorType as viem_CcipRequestErrorType, ccipRequest as viemCcipRequest, } from 'viem' import { getChainContractAddress } from '../clients/chain.js' import { type CcipBatchRequestErrorType, ccipBatchRequest, } from './ccipBatchRequest.js' const abi = parseAbi([ 'function query((address,string[],bytes)[]) returns (bool[],bytes[])', ]) const universalResolverQuerySig = '0xa780bab6' // ================================ // Ccip request // ================================ export type CcipRequestErrorType = | GetChainContractAddressErrorType | IsAddressEqualErrorType | DecodeFunctionDataErrorType | CcipBatchRequestErrorType | EncodeFunctionResultErrorType | viem_CcipRequestErrorType export const ccipRequest = (chain: TChain) => async ({ data, sender, urls, }: CcipRequestParameters): ReturnType => { // TODO: Improve const universalResolverAddress = getChainContractAddress({ chain, contract: 'ensUniversalResolver', }) const isUniversalResolverRequest = isAddressEqual( sender, universalResolverAddress, ) if ( isUniversalResolverRequest && data.slice(0, 10) === universalResolverQuerySig ) { const { args } = decodeFunctionData({ abi, data }) const result = await ccipBatchRequest(args[0]) return encodeFunctionResult({ abi, result }) } return viemCcipRequest({ data, sender, urls }) }