import { ethRegistrarCommitSnippet } from '@ensdomains/ensjs-abi/v2/ethRegistrar' import type { Account, Chain, GetChainContractAddressErrorType, Hash, WriteContractErrorType, WriteContractParameters, } from 'viem' import { writeContract } from 'viem/actions' import { getAction } from 'viem/utils' import type { ChainWithContracts, RequireClientContracts, } from '../../../clients/chain.js' import { getChainContractAddress } from '../../../clients/chain.js' import { UnsupportedNameTypeError } from '../../../errors/general.js' import type { Prettify, WriteTransactionParameters, } from '../../../types/index.js' import { ASSERT_NO_TYPE_ERROR } from '../../../types/internal.js' import { type ClientWithOverridesErrorType, clientWithOverrides, } from '../../../utils/clientWithOverrides.js' import { getNameType } from '../../../utils/name/getNameType.js' import { type L2RegistrationParameters, type MakeL2CommitmentErrorType, makeL2Commitment, } from '../../../utils/registrar/registerHelpers.js' import { type WrappedLabelLengthCheckErrorType, wrappedLabelLengthCheck, } from '../../../utils/v1/nameWrapper/wrapper.js' // ================================ // Write Parameters // ================================ export type CommitNameWriteParametersParameters = L2RegistrationParameters export type CommitNameWriteParametersReturnType< chain extends Chain, account extends Account, > = ReturnType> export type CommitNameWriteParametersErrorType = | UnsupportedNameTypeError | WrappedLabelLengthCheckErrorType | GetChainContractAddressErrorType | MakeL2CommitmentErrorType export const commitNameWriteParameters = < chain extends Chain, account extends Account, >( client: RequireClientContracts, args: CommitNameWriteParametersParameters, ) => { ASSERT_NO_TYPE_ERROR(client) const nameType = getNameType(`${args.label}.eth`) if (nameType !== 'eth-2ld') throw new UnsupportedNameTypeError({ nameType, supportedNameTypes: ['eth-2ld'], details: 'Only 2ld-eth name registration is supported', }) wrappedLabelLengthCheck(args.label) return { address: getChainContractAddress({ chain: client.chain, contract: 'ensEthRegistrar', }), abi: ethRegistrarCommitSnippet, functionName: 'commit', args: [makeL2Commitment(args)], chain: client.chain, account: client.account, } as const satisfies WriteContractParameters } // ================================ // Action // ================================ export type CommitNameParameters< chain extends Chain, account extends Account, chainOverride extends ChainWithContracts<'ensEthRegistrar'> | undefined, > = Prettify< CommitNameWriteParametersParameters & WriteTransactionParameters > export type CommitNameReturnType = Hash export type CommitNameErrorType = | CommitNameWriteParametersErrorType | ClientWithOverridesErrorType | WriteContractErrorType /** * Commits a name to be registered * @param client - {@link Client} * @param options - {@link CommitNameOptions} * @returns Transaction hash. {@link CommitNameReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { sepolia } from 'viem/chains' * import { addEnsContracts } from '@ensdomains/ensjs' * import { commitName } from '@ensdomains/ensjs/wallet' * import { randomSecret } from '@ensdomains/ensjs/utils' * * const [account] = await window.ethereum.request({ method: 'eth_requestAccounts' }) * const wallet = createWalletClient({ * account, * chain: addEnsContracts(sepolia), * transport: custom(window.ethereum), * }) * const secret = randomSecret() * const hash = await commitName(wallet, { * label: 'example', * owner: account, * duration: 31536000, // 1 year * secret, * }) * // 0x... */ export async function commitName< chain extends Chain, account extends Account, chainOverride extends ChainWithContracts<'ensEthRegistrar'> | undefined, >( client: RequireClientContracts, { label, owner, duration, secret, resolverAddress, subregistryAddress, referrer, ...txArgs }: CommitNameParameters, ): Promise { ASSERT_NO_TYPE_ERROR(client) const writeParameters = commitNameWriteParameters( clientWithOverrides(client, txArgs), { label, owner, duration, secret, resolverAddress, subregistryAddress, referrer, }, ) const writeContractAction = getAction(client, writeContract, 'writeContract') return writeContractAction({ ...writeParameters, ...txArgs, } as WriteContractParameters) }