import type { Account, Address, Hash, SendTransactionParameters, Transport, } from 'viem' import { sendTransaction } from 'viem/actions' import type { ChainWithPns, ClientWithAccount } from '../../contracts/consts.js' import type { Prettify, SimpleTransactionRequest, WriteTransactionParameters, } from '../../types.js' import type { EncodedAbi } from '../../utils/encoders/encodeAbi.js' import { encodeSetAbi, type EncodeSetAbiParameters, } from '../../utils/encoders/encodeSetAbi.js' import { namehash } from '../../utils/normalise.js' export type SetAbiRecordDataParameters = { /** Name to set ABI for */ name: string /** Encoded ABI data to set */ encodedAbi: EncodedAbi /** Resolver address to set ABI on */ resolverAddress: Address } export type SetAbiRecordDataReturnType = SimpleTransactionRequest export type SetAbiRecordParameters< TChain extends ChainWithPns, TAccount extends Account | undefined, TChainOverride extends ChainWithPns | undefined, > = Prettify< SetAbiRecordDataParameters & WriteTransactionParameters > export type SetAbiRecordReturnType = Hash export const makeFunctionData = < TChain extends ChainWithPns, TAccount extends Account | undefined, >( _wallet: ClientWithAccount, { name, encodedAbi, resolverAddress }: SetAbiRecordDataParameters, ): SetAbiRecordDataReturnType => { return { to: resolverAddress, data: encodeSetAbi({ namehash: namehash(name), ...encodedAbi, } as EncodeSetAbiParameters), } } /** * Sets the ABI for a name on a resolver. * @param wallet - {@link ClientWithAccount} * @param parameters - {@link SetAbiRecordParameters} * @returns Transaction hash. {@link SetAbiRecordReturnType} * * @example * import abi from './abi.json' * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts } from '@pnsdomains/pnsjs' * import { encodeAbi } from '@pnsdomains/pnsjs/utils' * import { setAbiRecord } from '@pnsdomains/pnsjs/wallet' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }) * * const encodedAbi = await encodeAbi({ encodeAs: 'json', abi }) * const hash = await setAbiRecord(wallet, { * name: 'pns.pls', * encodedAbi, * resolverAddress: '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41', * }) * // 0x... */ async function setAbiRecord< TChain extends ChainWithPns, TAccount extends Account | undefined, TChainOverride extends ChainWithPns | undefined = ChainWithPns, >( wallet: ClientWithAccount, { name, encodedAbi, resolverAddress, ...txArgs }: SetAbiRecordParameters, ): Promise { const data = makeFunctionData(wallet, { name, encodedAbi, resolverAddress, }) const writeArgs = { ...data, ...txArgs, } as SendTransactionParameters return sendTransaction(wallet, writeArgs) } setAbiRecord.makeFunctionData = makeFunctionData export default setAbiRecord