import type { Account, Address, Chain, Client, NamehashErrorType, Transport, WriteContractErrorType, WriteContractParameters, WriteContractReturnType, } from 'viem' import { writeContract } from 'viem/actions' import { getAction } from 'viem/utils' import type { Prettify, WriteTransactionParameters, } from '../../../types/index.js' import { type ClientWithOverridesErrorType, clientWithOverrides, } from '../../../utils/clientWithOverrides.js' import type { AbiEncodeAs } from '../../../utils/resolver/encodeAbi.js' import { type SetAbiParameters, type SetAbiParametersErrorType, type SetAbiParametersReturnType, setAbiParameters, } from '../../../utils/resolver/setAbi.js' // export type SetAbiRecordParameters = // Prettify< // EncodeAbiParameters & { // /** Name to set ABI for */ // name: string; // /** Resolver address to set ABI on */ // resolverAddress: Address; // } // >; // export type SetAbiRecordOptions< // encodeAs extends AbiEncodeAs, // chain extends Chain | undefined, // account extends Account | undefined, // chainOverride extends Chain | undefined, // > = Prettify< // SetAbiRecordParameters & // WriteTransactionParameters // >; // export type SetAbiRecordReturnType = WriteContractReturnType; // export type SetAbiRecordErrorType = Error; // ================================ // Write parameters // ================================ export type SetAbiRecordWriteParametersParameters< encodeAs extends AbiEncodeAs, > = Prettify< SetAbiParameters & { /** Name to set ABI for */ name: string /** Resolver address to set ABI on */ resolverAddress: Address } > export type SetAbiRecordWriteParametersReturnType = ReturnType< typeof setAbiRecordWriteParameters > export type SetAbiRecordWriteParametersErrorType = | SetAbiParametersErrorType | NamehashErrorType export const setAbiRecordWriteParameters = async < encodeAs extends AbiEncodeAs, chain extends Chain, account extends Account, >( client: Client, { name, data, encodeAs, resolverAddress, }: SetAbiRecordWriteParametersParameters, ) => { return { address: resolverAddress, chain: client.chain, account: client.account, ...(await setAbiParameters({ name, data, encodeAs, } as SetAbiParameters)), } as const satisfies WriteContractParameters< SetAbiParametersReturnType['abi'] > } // ================================ // Action // ================================ export type SetAbiRecordParameters< encodeAs extends AbiEncodeAs, chain extends Chain | undefined, account extends Account | undefined, chainOverride extends Chain | undefined, > = SetAbiRecordWriteParametersParameters & WriteTransactionParameters export type SetAbiRecordReturnType = WriteContractReturnType export type SetAbiRecordErrorType = | SetAbiRecordWriteParametersErrorType | ClientWithOverridesErrorType | WriteContractErrorType /** * Sets the ABI for a name on a resolver. * @param client - {@link Client} * @param options - {@link SetAbiRecordParameters} * @returns Transaction hash. {@link SetAbiRecordReturnType} * * @example * import { createWalletClient, custom, erc20Abi } from 'viem' * import { mainnet } from 'viem/chains' * import { addEnsContracts } from '@ensdomains/ensjs' * import { setAbiRecord } from '@ensdomains/ensjs/wallet' * * const [account] = await window.ethereum.request({ method: 'eth_requestAccounts' }) * const wallet = createWalletClient({ * account, * chain: addEnsContracts(mainnet), * transport: custom(window.ethereum), * }) * const hash = await setAbiRecord(wallet, { * name: 'ens.eth', * encodeAs: 'json', * data: erc20Abi, * resolverAddress: '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41', * }) * // 0x... */ export async function setAbiRecord< encodeAs extends AbiEncodeAs, chain extends Chain | undefined, account extends Account | undefined, chainOverride extends Chain | undefined, >( client: Client, { name, data, encodeAs, resolverAddress, ...txArgs }: SetAbiRecordParameters, ): Promise { const writeParameters = await setAbiRecordWriteParameters( clientWithOverrides(client, txArgs), { name, data, encodeAs, resolverAddress, } as SetAbiRecordWriteParametersParameters, ) const writeContractAction = getAction(client, writeContract, 'writeContract') return writeContractAction({ ...writeParameters, ...txArgs, } as WriteContractParameters) }