import { encodeFunctionData, type Account, type Address, type Hash, type SendTransactionParameters, type 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 { getChainContractAddress } from '../../contracts/getChainContractAddress.js' import { tipSnippet } from '../../contracts/tips.js' export type SendTipDataParameters = { /** The recipient address for */ recipient: Address /** The amount to tip for */ amount: bigint /** The comment for */ comment: string | null } export type SendTipDataReturnType = SimpleTransactionRequest & { value: bigint } export type SendTipParameters< TChain extends ChainWithPns, TAccount extends Account | undefined, TChainOverride extends ChainWithPns | undefined, > = Prettify< SendTipDataParameters & WriteTransactionParameters > export type SendTipReturnType = Hash export const makeFunctionData = < TChain extends ChainWithPns, TAccount extends Account | undefined, >( wallet: ClientWithAccount, { recipient, amount, comment }: SendTipDataParameters, ): SendTipDataReturnType => { const tipsAddress = getChainContractAddress({ client: wallet, contract: 'pnsTips', }) return { to: tipsAddress, data: encodeFunctionData({ abi: tipSnippet, functionName: 'tip', args: [recipient, comment as `0x${string}` || '0x'], }), value: amount, } } /** * Send some tips to domain manager. * @param wallet - {@link ClientWithAccount} * @param parameters - {@link SendTipParameters} * @returns Transaction hash. {@link SendTipReturnType} * * @example * import { createWalletClient, custom } from 'viem' * import { mainnet } from 'viem/chains' * import { addPnsContracts } from '@pnsdomains/pnsjs' * import { sendTip } from '@pnsdomains/pnsjs/wallet' * * const wallet = createWalletClient({ * chain: addPnsContracts(mainnet), * transport: custom(window.ethereum), * }) * const hash = await sendTip(wallet, { * recipient: '0x', * amount: 1000000, * comment: 'Hello world', * }) * // 0x... */ async function sendTip< TChain extends ChainWithPns, TAccount extends Account | undefined, TChainOverride extends ChainWithPns | undefined = ChainWithPns, >( wallet: ClientWithAccount, { recipient, amount, comment, ...txArgs }: SendTipParameters, ): Promise { const data = makeFunctionData(wallet, { recipient, amount, comment, }) const writeArgs = { ...data, ...txArgs, } as SendTransactionParameters return sendTransaction(wallet, writeArgs) } sendTip.makeFunctionData = makeFunctionData export default sendTip