pimlicolabs / permissionless.js

TypeScript utilities built on viem for ERC-4337: Account Abstraction
https://docs.pimlico.io/permissionless
MIT License
162 stars 43 forks source link

Question: Estimation Gas from sendTransactions array #271

Open quan612 opened 3 weeks ago

quan612 commented 3 weeks ago

Hi,

I am new to pimlico and permissionless

I have a working code when we need to bulk transfer out some NFTs from a smart account into a destination wallet, using sendTransactions()

https://docs.pimlico.io/permissionless/reference/smart-account-actions/sendTransactions

Wondering how to estimate the gas for these bulk transfers?

working code:

const transactions: {
    to: Address;
    data: Hex;
}[] = [];

selectedNfts.map((nft) => {
    transactions.push({
        to: NFT_CONTRACT_ADDRESS,
        data: encodeFunctionData({
            abi: contractAbi,
            functionName: "safeTransferFrom",
            args: [
                smartAccountAddress,
                destinationWallet as `0x${string}`,
                BigInt(nft.tokenId),
            ],
        }),
    });
});

then

const transactionHash = await smartAccountClient.sendTransactions({
    transactions: transactions,
});

I saw this https://docs.pimlico.io/permissionless/reference/bundler-actions/estimateUserOperationGas but feel like its for single transaction

permissionless: 0.1.44 entry_point: v07

code that setup smartAccountClient:


const safeAccount = await signerToSafeSmartAccount(publicClient, {
                signer: customSigner,
                safeVersion: "1.4.1",
                entryPoint: ENTRYPOINT_ADDRESS_V07,
            });

            const pimlicoPaymaster = createPimlicoPaymasterClient({
                chain: networkToUse,

                transport: http(process.env.NEXT_PUBLIC_PIMLICO_PAYMASTER_URL),
                entryPoint: ENTRYPOINT_ADDRESS_V07,
            });

            const pimlicoBundler = createPimlicoBundlerClient({
                transport: http(process.env.NEXT_PUBLIC_PIMLICO_PAYMASTER_URL),
                entryPoint: ENTRYPOINT_ADDRESS_V07,
            });

const smartAccountClient = createSmartAccountClient({
                account: safeAccount,
                entryPoint: ENTRYPOINT_ADDRESS_V07,
                chain: networkToUse,
                bundlerTransport: http(process.env.NEXT_PUBLIC_PIMLICO_PAYMASTER_URL),
                middleware: {
                    sponsorUserOperation: pimlicoPaymaster.sponsorUserOperation,
                    gasPrice: async () => (await pimlicoBundler.getUserOperationGasPrice()).fast,
                },
            });
plusminushalf commented 3 weeks ago

You can estimate using estimateUserOperationGas

bundlerClient.estimateUserOperationGas({
    userOperation: {
        ...(await smartAccountClient.prepareUserOperationRequest({
            userOperation: {
                callData: await smartAccount.encodeCallData([
                    {
                        to: zeroAddress,
                        value: 0n,
                        data: "0x"
                    },
                    {
                        to: zeroAddress,
                        value: 0n,
                        data: "0x"
                    }
                ])
            }
        }))
    }
})