import { encodeFunctionData, type Account, type Hash, type SendTransactionParameters, type Transport, } from 'viem' import { sendTransaction } from 'viem/actions' import type { ChainWithPns, ClientWithAccount } from '../../contracts/consts.js' import { plsRegistrarControllerCommitSnippet } from '../../contracts/plsRegistrarController.js' import { getChainContractAddress } from '../../contracts/getChainContractAddress.js' import { UnsupportedNameTypeError } from '../../errors/general.js' import type { Prettify, SimpleTransactionRequest, WriteTransactionParameters, } from '../../types.js' import { getNameType } from '../../utils/getNameType.js' import { makeCommitment, type RegistrationParameters, } from '../../utils/registerHelpers.js' import { wrappedLabelLengthCheck } from '../../utils/wrapper.js' export type CommitNameDataParameters = RegistrationParameters export type CommitNameDataReturnType = SimpleTransactionRequest export type CommitNameParameters< TChain extends ChainWithPns, TAccount extends Account | undefined, TChainOverride extends ChainWithPns | undefined, > = Prettify< CommitNameDataParameters & WriteTransactionParameters > export type CommitNameReturnType = Hash export const makeFunctionData = < TChain extends ChainWithPns, TAccount extends Account | undefined, >( wallet: ClientWithAccount, args: CommitNameDataParameters, ): CommitNameDataReturnType => { const labels = args.name.split('.') const nameType = getNameType(args.name) if (nameType !== 'pls-2ld') throw new UnsupportedNameTypeError({ nameType, supportedNameTypes: ['pls-2ld'], details: 'Only 2ld-pls name registration is supported', }) wrappedLabelLengthCheck(labels[0]) return { to: getChainContractAddress({ client: wallet, contract: 'pnsPlsRegistrarController', }), data: encodeFunctionData({ abi: plsRegistrarControllerCommitSnippet, functionName: 'commit', args: [makeCommitment(args)], }), } } /** * Commits a name to be registered * @param wallet - {@link ClientWithAccount} * @param parameters - {@link CommitNameParameters} * @returns Transaction hash. {@link CommitNameReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts } from '@pnsdomains/pnsjs' * import { commitName } from '@pnsdomains/pnsjs/wallet' * import { randomSecret } from '@pnsdomains/pnsjs/utils' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }) * const secret = randomSecret() * const hash = await commitName(wallet, { * name: 'example.pls', * owner: '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7', * duration: 31536000, // 1 year * secret, * }) * // 0x... */ async function commitName< TChain extends ChainWithPns, TAccount extends Account | undefined, TChainOverride extends ChainWithPns | undefined = ChainWithPns, >( wallet: ClientWithAccount, { name, owner, duration, secret, resolverAddress, records, reverseRecord, fuses, ...txArgs }: CommitNameParameters, ): Promise { const data = makeFunctionData(wallet, { name, owner, duration, secret, resolverAddress, records, reverseRecord, fuses, }) const writeArgs = { ...data, ...txArgs, } as SendTransactionParameters return sendTransaction(wallet, writeArgs) } commitName.makeFunctionData = makeFunctionData export default commitName