import type { Account, Transport, WalletClient } from 'viem' import type { ChainWithPns } from '../../contracts/consts.js' import clearRecords, { type ClearRecordsParameters, type ClearRecordsReturnType, } from '../../functions/wallet/clearRecords.js' import commitName, { type CommitNameParameters, type CommitNameReturnType, } from '../../functions/wallet/commitName.js' import createSubname, { type CreateSubnameParameters, type CreateSubnameReturnType, } from '../../functions/wallet/createSubname.js' import deleteSubname, { type DeleteSubnameParameters, type DeleteSubnameReturnType, } from '../../functions/wallet/deleteSubname.js' import registerName, { type RegisterNameParameters, type RegisterNameReturnType, } from '../../functions/wallet/registerName.js' import renewNames, { type RenewNamesParameters, type RenewNamesReturnType, } from '../../functions/wallet/renewNames.js' import setAbiRecord, { type SetAbiRecordParameters, type SetAbiRecordReturnType, } from '../../functions/wallet/setAbiRecord.js' import setAddressRecord, { type SetAddressRecordParameters, type SetAddressRecordReturnType, } from '../../functions/wallet/setAddressRecord.js' import setChildFuses, { type SetChildFusesParameters, type SetChildFusesReturnType, } from '../../functions/wallet/setChildFuses.js' import setContentHashRecord, { type SetContentHashRecordParameters, type SetContentHashRecordReturnType, } from '../../functions/wallet/setContentHashRecord.js' import setFuses, { type SetFusesParameters, type SetFusesReturnType, } from '../../functions/wallet/setFuses.js' import setPrimaryName, { type SetPrimaryNameParameters, type SetPrimaryNameReturnType, } from '../../functions/wallet/setPrimaryName.js' import setRecords, { type SetRecordsParameters, type SetRecordsReturnType, } from '../../functions/wallet/setRecords.js' import setResolver, { type SetResolverParameters, type SetResolverReturnType, } from '../../functions/wallet/setResolver.js' import setTextRecord, { type SetTextRecordParameters, type SetTextRecordReturnType, } from '../../functions/wallet/setTextRecord.js' import transferName, { type TransferNameParameters, type TransferNameReturnType, } from '../../functions/wallet/transferName.js' import unwrapName, { type UnwrapNameParameters, type UnwrapNameReturnType, } from '../../functions/wallet/unwrapName.js' import wrapName, { type WrapNameParameters, type WrapNameReturnType, } from '../../functions/wallet/wrapName.js' import sendTip, { type SendTipParameters, type SendTipReturnType, } from '../../functions/wallet/sendTip.js' export type PnsWalletActions< TChain extends ChainWithPns, TAccount extends Account | undefined, > = { /** * Clears the records for a name on a resolver. * @param parameters - {@link ClearRecordsParameters} * @returns Transaction hash. {@link ClearRecordsReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.clearRecords({ * name: 'pns.pls', * resolverAddress: '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41', * }) * // 0x... */ clearRecords: ({ name, resolverAddress, ...txArgs }: ClearRecordsParameters< TChain, TAccount, TChain >) => Promise /** * Commits a name to be registered * @param parameters - {@link CommitNameParameters} * @returns Transaction hash. {@link CommitNameReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * import { randomSecret } from '@pnsdomains/pnsjs/utils' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const secret = randomSecret() * const hash = await wallet.commitName({ * name: 'example.pls', * owner: '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7', * duration: 31536000, // 1 year * secret, * }) * // 0x... */ commitName: ({ name, owner, duration, secret, resolverAddress, records, reverseRecord, fuses, ...txArgs }: CommitNameParameters< TChain, TAccount, TChain >) => Promise /** * Creates a subname * @param parameters - {@link CreateSubnameParameters} * @returns Transaction hash. {@link CreateSubnameReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.createSubname({ * name: 'sub.pns.pls', * owner: '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7', * contract: 'registry', * }) * // 0x... */ createSubname: ({ name, contract, owner, resolverAddress, expiry, fuses, ...txArgs }: CreateSubnameParameters< TChain, TAccount, TChain >) => Promise /** * Deletes a subname * @param parameters - {@link DeleteSubnameParameters} * @returns Transaction hash. {@link DeleteSubnameReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.deleteSubname({ * name: 'sub.pns.pls', * contract: 'registry', * }) * // 0x... */ deleteSubname: ({ name, contract, asOwner, ...txArgs }: DeleteSubnameParameters< TChain, TAccount, TChain >) => Promise /** * Registers a name on PNS * @param parameters - {@link RegisterNameParameters} * @returns Transaction hash. {@link RegisterNameReturnType} * * @example * import { createPublicClient, createWalletClient, http, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsPublicActions, pnsWalletActions } from '@pnsdomains/pnsjs' * import { randomSecret } from '@pnsdomains/pnsjs/utils' * * const mainnetWithPns = addPnsContracts(mainnet) * const client = createPublicClient({ * chain: mainnetWithPns, * transport: http(), * }).extend(pnsPublicActions) * const wallet = createWalletClient({ * chain: mainnetWithPns, * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const secret = randomSecret() * const params = { * name: 'example.pls', * owner: '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7', * duration: 31536000, // 1 year * secret, * } * * const commitmentHash = await wallet.commitName(params) * await client.waitForTransactionReceipt({ hash: commitmentHash }) // wait for commitment to finalise * await new Promise((resolve) => setTimeout(resolve, 60 * 1_000)) // wait for commitment to be valid * * const { base, premium } = await client.getPrice({ nameOrNames: params.name, duration: params.duration }) * const value = (base + premium) * 110n / 100n // add 10% to the price for buffer * const hash = await wallet.registerName({ ...params, value }) * // 0x... */ registerName: ({ name, owner, duration, secret, resolverAddress, records, reverseRecord, fuses, value, ...txArgs }: RegisterNameParameters< TChain, TAccount, TChain >) => Promise /** * Renews a name or names for a specified duration. * @param parameters - {@link RenewNamesParameters} * @returns Transaction hash. {@link RenewNamesReturnType} * * @example * import { createPublicClient, createWalletClient, http, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsPublicActions, pnsWalletActions } from '@pnsdomains/pnsjs' * * const mainnetWithPns = addPnsContracts(mainnet) * const client = createPublicClient({ * chain: mainnetWithPns, * transport: http(), * }).extend(pnsPublicActions) * const wallet = createWalletClient({ * chain: mainnetWithPns, * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * * const duration = 31536000 // 1 year * const { base, premium } = await client.getPrice({ * nameOrNames: 'example.pls', * duration, * }) * const value = (base + premium) * 110n / 100n // add 10% to the price for buffer * const hash = await wallet.renewNames({ * nameOrNames: 'example.pls', * duration, * value, * }) * // 0x... */ renewNames: ({ nameOrNames, duration, value, ...txArgs }: RenewNamesParameters< TChain, TAccount, TChain >) => Promise /** * Sets the ABI for a name on a resolver. * @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, pnsWalletActions } from '@pnsdomains/pnsjs' * import { encodeAbi } from '@pnsdomains/pnsjs/utils' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * * const encodedAbi = await encodeAbi({ encodeAs: 'json', abi }) * const hash = await wallet.setAbiRecord({ * name: 'pns.pls', * encodedAbi, * resolverAddress: '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41', * }) * // 0x... */ setAbiRecord: ({ name, encodedAbi, resolverAddress, ...txArgs }: SetAbiRecordParameters< TChain, TAccount, TChain >) => Promise /** * Sets an address record for a name on a resolver. * @param parameters - {@link SetAddressRecordParameters} * @returns Transaction hash. {@link SetAddressRecordReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.setAddressRecord({ * name: 'pns.pls', * coin: 'PLS', * value: '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7', * resolverAddress: '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41', * }) * // 0x... */ setAddressRecord: ({ name, coin, value, resolverAddress, ...txArgs }: SetAddressRecordParameters< TChain, TAccount, TChain >) => Promise /** * Sets the fuses for a name as the parent. * @param parameters - {@link SetChildFusesParameters} * @returns Transaction hash. {@link SetChildFusesReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.setChildFuses({ * name: 'sub.pns.pls', * fuses: { * parent: { * named: ['PARENT_CANNOT_CONTROl'], * }, * }, * }) * // 0x... */ setChildFuses: ({ name, fuses, expiry, ...txArgs }: SetChildFusesParameters< TChain, TAccount, TChain >) => Promise /** * Sets the content hash record for a name on a resolver. * @param parameters - {@link SetContentHashRecordParameters} * @returns Transaction hash. {@link SetContentHashRecordReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.setContentHashRecord({ * name: 'pns.pls', * value: 'ipns://k51qzi5uqu5djdczd6zw0grmo23j2vkj9uzvujencg15s5rlkq0ss4ivll8wqw', * resolverAddress: '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41', * }) * // 0x... */ setContentHashRecord: ({ name, contentHash, resolverAddress, ...txArgs }: SetContentHashRecordParameters< TChain, TAccount, TChain >) => Promise /** * Sets the fuses for a name. * @param parameters - {@link SetFusesParameters} * @returns Transaction hash. {@link SetFusesReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.setFuses({ * name: 'sub.pns.pls', * fuses: { * named: ['CANNOT_TRANSFER'], * }, * }) * // 0x... */ setFuses: ({ name, fuses, ...txArgs }: SetFusesParameters< TChain, TAccount, TChain >) => Promise /** * Sets a primary name for an address. * @param parameters - {@link SetPrimaryNameParameters} * @returns Transaction hash. {@link SetPrimaryNameReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.setPrimaryName({ * name: 'pns.pls', * }) * // 0x... */ setPrimaryName: ({ name, address, resolverAddress, ...txArgs }: SetPrimaryNameParameters< TChain, TAccount, TChain >) => Promise /** * Sets multiple records for a name on a resolver. * @param parameters - {@link SetRecordsParameters} * @returns Transaction hash. {@link SetRecordsReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.setRecords({ * name: 'pns.pls', * coins: [ * { * coin: 'PLS', * value: '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7', * }, * ], * texts: [{ key: 'foo', value: 'bar' }], * resolverAddress: '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41', * }) * // 0x... */ setRecords: ({ name, resolverAddress, // eslint-disable-next-line @typescript-eslint/no-shadow clearRecords, contentHash, texts, coins, abi, ...txArgs }: SetRecordsParameters< TChain, TAccount, TChain >) => Promise /** * Sets a resolver for a name. * @param parameters - {@link SetResolverParameters} * @returns Transaction hash. {@link SetResolverReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.setResolver({ * name: 'pns.pls', * contract: 'registry', * resolverAddress: '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41', * }) * // 0x... */ setResolver: ({ name, contract, resolverAddress, ...txArgs }: SetResolverParameters< TChain, TAccount, TChain >) => Promise /** * Sets a text record for a name on a resolver. * @param parameters - {@link SetTextRecordParameters} * @returns Transaction hash. {@link SetTextRecordReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.setTextRecord({ * name: 'pns.pls', * key: 'foo', * value: 'bar', * resolverAddress: '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41', * }) * // 0x... */ setTextRecord: ({ name, key, value, resolverAddress, ...txArgs }: SetTextRecordParameters< TChain, TAccount, TChain >) => Promise /** * Transfers a name to a new owner. * @param parameters - {@link TransferNameParameters} * @returns Transaction hash. {@link TransferNameReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.transferName({ * name: 'pns.pls', * newOwnerAddress: '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7', * contract: 'registry', * }) * // 0x... */ transferName: ({ name, newOwnerAddress, contract, reclaim, asParent, ...txArgs }: TransferNameParameters< TChain, TAccount, TChain >) => Promise /** * Unwraps a name. * @param parameters - {@link UnwrapNameParameters} * @returns Transaction hash. {@link UnwrapNameReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.unwrapName({ * name: 'example.pls', * newOwnerAddress: '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7', * newRegistrantAddress: '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7', * }) * // 0x... */ unwrapName: ({ name, newOwnerAddress, newRegistrantAddress, ...txArgs }: UnwrapNameParameters< TName, TChain, TAccount, TChain >) => Promise /** * Wraps a name. * @param parameters - {@link WrapNameParameters} * @returns Transaction hash. {@link WrapNameReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.wrapName({ * name: 'pns.pls', * newOwnerAddress: '0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7', * }) * // 0x... */ wrapName: ({ name, newOwnerAddress, fuses, resolverAddress, ...txArgs }: WrapNameParameters< TName, TChain, TAccount, TChain >) => Promise /** * Send some tips to domain manager. * @param parameters - {@link SendTipParameters} * @returns Transaction hash. {@link SendTipReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) * const hash = await wallet.sendTip({ * recipient: '0x', * amount: 1000000, * comment: 'Hello world' * }) * // 0x... */ sendTip: ({ recipient, amount, comment, ...txArgs }: SendTipParameters< TChain, TAccount, TChain >) => Promise } /** * Extends the viem client with PNS wallet actions * @param client - The viem {@link WalletClient} object to add the PNS wallet actions to * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts, pnsWalletActions } from '@pnsdomains/pnsjs' * * const clientWithPns = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }).extend(pnsWalletActions) */ export const pnsWalletActions = < TTransport extends Transport = Transport, TChain extends ChainWithPns = ChainWithPns, TAccount extends Account | undefined = Account | undefined, >( client: WalletClient, ): PnsWalletActions => ({ clearRecords: (parameters) => clearRecords(client, parameters), commitName: (parameters) => commitName(client, parameters), createSubname: (parameters) => createSubname(client, parameters), deleteSubname: (parameters) => deleteSubname(client, parameters), registerName: (parameters) => registerName(client, parameters), renewNames: (parameters) => renewNames(client, parameters), setAbiRecord: (parameters) => setAbiRecord(client, parameters), setAddressRecord: (parameters) => setAddressRecord(client, parameters), setChildFuses: (parameters) => setChildFuses(client, parameters), setContentHashRecord: (parameters) => setContentHashRecord(client, parameters), setFuses: (parameters) => setFuses(client, parameters), setPrimaryName: (parameters) => setPrimaryName(client, parameters), setRecords: (parameters) => setRecords(client, parameters), setResolver: (parameters) => setResolver(client, parameters), setTextRecord: (parameters) => setTextRecord(client, parameters), transferName: (parameters) => transferName(client, parameters), unwrapName: (parameters) => unwrapName(client, parameters), wrapName: (parameters) => wrapName(client, parameters), sendTip: (parameters) => sendTip(client, parameters), })